Ich bin ein wenig verwirrt über Retain-Zyklus.Wie die Bilder zeigen, ist es ein Retain-Zyklus.Meine Meinung ist, wenn außerhalb des Bereichs, test0 wird freigegeben, obj_ wird freigeben, so dass die Referenz-Anzahl von Objekt A und B wird Seien Sie eins, auch wenn dies bei Test1 passiert, dann ist die Referenzzählung Null, schließlich befreien Sie den Speicher. Was ist das Problem? enter image description here enter image description hereWarum behält Zyklus Leckspeicher beibehalten?
Antwort
Nach Zuteilung TEST0 wird durch die lokale Referenz beibehalten und eine setObject TEST0 Zählung behält 1. Nach dem Aufruf des test1 hat einen Beibehaltungszähler von 2. Bei der TEST0 Ortsollwert vorbei außerhalb des Gültigkeitsbereiches des TEST0 Objekts hat Die Referenzzählung wird um eins verringert, so dass sie bei Eins bleibt. Das gleiche gilt für Test1 und beide bleiben mit einer Referenzzählung von 1.
Ich denke, dass Sie fälschlicherweise annehmen, dass jedes Mal, wenn die Retain-Anzahl eines Objekts dekrementiert wird, die Referenzen, die es hält, dekrementiert werden ist nicht streng wahr -. test0 wird sein Obj mit einer Referenzzählung von 1 "halten", bis es selbst freigegeben wird. Da die Objekte einander ihre Zählungen verweisen können unter nie fallen 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
Dank sehr viel, bevor ich denke, wenn außerhalb des Gültigkeitsbereichs ausgeführt wird, wird TEST0 lösen, und es ist obj wird auch release.The Tatsache ist obj wird freigeben nur wenn das Objekt freigibt. –
"test0 wird sein obj mit einer Referenzzählung von 1 halten, bis es selbst freigegeben wird." Du meinst "bis es selbst freigegeben ist". – newacct