2016-03-19 9 views
0

私は、サイクルを保持することについて少し混乱しています。写真が示すように、それは保持サイクルです。私の意見は、スコープを使い果たしたときに、test0がリリースされ、obj_が解放されるため、オブジェクトAおよびBの参照カウントが1つで、これがtest1で起きたときも参照カウントはゼロになり、最後にメモリを解放します。何が問題なのですか?割り当てTEST0際 enter image description here enter image description hereサイクルリークメモリを保持するのはなぜですか?

答えて

1

はローカル基準によって保持され、TEST1のsetObjectメソッドのTEST0の呼び出しがTEST0のローカル参照すると2のカウントを保持する範囲外通過TEST0オブジェクトのをした後に1のカウントを保持しています参照カウントは1だけデクリメントされ、1になります。 test1についても同じことが言え、両方とも参照カウント1が残っています。

オブジェクトの保持カウントがデクリメントされる度に間違っていると思われるかもしれません。厳密には真実ではありません。 test0は自身が解放されるまで参照カウント1でオブジェクトobjを「ホールド」します。オブジェクトが1を参照するので、別の彼らの数が下回ることはありません。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 
スコープ外に実行しているとき、私は考える前に
+0

おかげで非常に多く、TEST0がリリースする、それはまたrelease.The事実はobjが解放されますされますOBJですオブジェクトが解放されたときだけです。 –

+0

"test0は、自身が解放されるまで参照カウント1でobjを「保持」します。あなたは「それ自身が解約されるまで」という意味です。 – newacct

関連する問題