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