Döngü döngüsü hakkında biraz kafam karıştı. Resimlerin gösterdiği gibi, bir devir döngüsü. Benim görüşümün kapsamı tükeniyorsa, test0 yayınlanacak, obj_ yayınlanacak, böylece A ve B nesnesinin referans sayısı bir tane de, bu test1'de gerçekleştiğinde, o zaman referans sayısı sıfır olacak, nihayet, hafızayı serbest bırakacaksınız. Problem nedir? ayırma test0 üzerine enter image description here enter image description hereÇevrim kaçağı belleğini neden koruyorsunuz?
0
A
cevap
1
yerel referans yardımı ile yerinde tutulmakta ve test1 en setObject test0 çağrısının 1 bir muhafaza sayısına sahip test0 yerel referans üzerine 2 bir muhafaza sayısı test0 amacı kapsamının dışına uzanan olan bir referans sayısı bir tarafından azaltılarak, bir sayı azalır. Aynı durum test1 için de geçerlidir ve her ikisi de referans sayısı 1 ile bırakılmıştır. Bir nesnenin korunma sayılarının her defalık azaltılmasının reddedildiği referans değerlerinin her zaman azaltıldığını varsaymak yanlış olabilir. kesinlikle doğru değil -. Test0, kendi tahliyesine kadar 1'inin referans numarası ile objesini "tutacaktır". nesneler birine başvuruda yana başka onların sayıları altına düşmemesi asla 1.
@interface Test : NSObject
{
id __strong obj_;
}
-(void)setObject:(id __strong) obj_;
@end
@implementation Test
-(id)init
{
self=[super init];
return self;
}
-(void)setObject:(id __strong) obj
{
obj_ = obj;
}
@end
// ...
id test0 = [[Test alloc] init];
NSLog(@"test0 etain count is %ld", CFGetRetainCount((__bridge CFTypeRef)test0)); // 1
id test1 = [[Test alloc] init];
[test0 setObject: test1];
[test1 setObject: test0];
NSLog(@"test0 retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)test0)); // 2
kapsam dışında çalıştırırken Bence önce
İlgili konular
- 1. UIWebView neden tüm belleğini açıklamıyor?
- 2. Brent'in çevrim algılama algoritması
- 3. Çevrim Haritası - iOS
- 4. Çevrim sayısı ölçümü
- 5. Hangi durumda kesme durumunu koruyorsunuz?
- 6. Bir işlemin belleğini dökün
- 7. ThreeJS uygulamasının belleğini boşaltma
- 8. HTML5 Çevrim depolama web çerçeve
- 9. Muteksleri kullanarak ortak bir kaynağı nasıl koruyorsunuz?
- 10. Python ktiplerle okuma belleğini okuma
- 11. Yığın Belleğini C programından değiştirme
- 12. CompileAssemblyFromSource belleğini sızmasını nasıl önleyebilirim?
- 13. nodejs varsayılan belleğini nasıl artırırım?
- 14. Koşullu operatör + yukarı çevrim + sabit başvuru
- 15. Çevrim içi senkronizasyonlu Çevrimdışı Android uygulaması
- 16. Spark'in yürütme belleğini çalışma zamanında değiştirebilir miyim?
- 17. İşlev, ayarlanan süreden sonra div belleğini gizlemiyor
- 18. Açıkhava belleğini daha büyük değerlere artırın
- 19. Bir işlemin tüm belleğini gdb'de nasıl ararım?
- 20. Çatal() ebeveynin tüm belleğini çoğaltır mı?
- 21. MS-DOS'taki tüm RAM belleğini kullan
- 22. CSS birim matematiğini javascript'te nasıl yapıyorsunuz ve CSS ünitesini koruyorsunuz?
- 23. Firebase Veritabanı çevrim içi veri engelleme yapmıyor Dinleyiciler
- 24. ctime() bir dize döndürüyor, neden bu dizenin belleğini boşaltmaya gerek yok()?
- 25. C++ 'da sabit bir nesnenin işaretçi üye değişkeninin belleğini dışarıdan neden değiştirmesine izin verilir?
- 26. Mail localhost'tan gönderilmiş ancak çevrim içi sunucusundan gönderilemiyor
- 27. Google javascript oturum açma api: çevrim dışı erişim yok
- 28. Windows'ta Python'da başka bir işlemin belleğini nasıl okuyabilirim?
- 29. Bir USB Flash Belleğini yazılımla nasıl yeniden algılarsınız?
- 30. OpenAL ses dosyasının belleğini nasıl tamamen siler ve bırakırsınız?
Çok teşekkürler, test0 yayınlayacak ve aynı zamanda release.The gerçeği obj yayınlayacak olan olacak obj var sadece nesne serbest bırakıldığında. –
"test0 kendi" 1 olan bir referans numarası ile kendi "serbest kalmasına" gerek kalmaz. " Yani "kendini serbest bırakana kadar" demek istiyorsun. – newacct