Почему сохраняется цикл утечки памяти?

Я немного запутался в сохранении цикла. Как показывают рисунки, это цикл сохранения. Мое мнение таково: когда выйдет из области видимости,test0 выпустит,obj_ отпустит, поэтому счетчик ссылок объектов A и B будет один Кроме того, когда это происходит на test1, то счетчик ссылок будет равен нулю, наконец, освободить память. В чем проблема? введите описание изображения здесь введите описание изображения здесь

1 ответ

При распределении test0 сохраняется локальной ссылкой и имеет счет сохранения 1. После вызова setObject test0 test1 имеет счет сохранения 2. Когда локальная ссылка test0 выходит из области видимости, счетчик ссылок объекта test0 уменьшается на единицу, оставляя это в одном. То же самое относится и к test1, и оба остаются с количеством ссылок 1.

Я думаю, что вы, возможно, ошибочно полагаете, что каждый раз, когда количество сохраняемых объектов уменьшается, ссылки, которые он содержит, уменьшаются - что не совсем верно. test0 будет "держать" свой объект со счетчиком ссылок 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
Другие вопросы по тегам