2016-03-19 30 views
0

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?

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
+0

Ç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. –

+0

"test0 kendi" 1 olan bir referans numarası ile kendi "serbest kalmasına" gerek kalmaz. " Yani "kendini serbest bırakana kadar" demek istiyorsun. – newacct

İlgili konular