Проблема с автоматическим подсчетом ссылок: назначение сохраненного объекта переменной unsafe_unretained;объект будет освобожден после назначения - PullRequest
11 голосов
/ 06 марта 2012

Я получаю это предупреждение

"Проблема автоматического подсчета ссылок: назначение сохраненного объекта переменной unsafe_unretained; объект будет освобожден после назначения"

Воткод

.h

@interface myObject : NSObject
{
}

@property (assign) id progressEnergy;

@end

.m

@implementation myObject

@synthesize progressEnergy;

-(id)init
{
    if ( ( self = [super init] ) )
    {
        progressEnergy = [[progress alloc] init]; //warning appear on this line
    }

    return self;
}

@end

Я уже пробовал

@property (assign) progress* progressEnergy;

но не повезло

Можете ли вы помочь мне выяснить, что не так?

Ответы [ 2 ]

27 голосов
/ 06 марта 2012

Изменение

@property (assign) progress* progressEnergy;

до

@property (strong) progress* progressEnergy;

, поэтому ваш myObject сохраняет объект progress.

9 голосов
/ 06 марта 2012

Что ж, это предупреждает вас, что вы присваиваете значение, которое должно быть выпущено в конце охватывающей области, которая оказывается следующей строкой. Вот так будет выглядеть ваш init после того, как ARC добавит в него свою магию:

-(id)init
{
    if ( ( self = [super init] ) )
    {
        progressEnergy = [[progress alloc] init];
        [progressEnergy release]; ///< Release progressEnergy since we've hit the end of the scope we created it in
    }

    return self;
}

Так что ваш progressEnergy теперь очень вероятно (хотя и не обязательно) быть висящим указателем.

Изменить определение свойства с assign на strong:

@property (strong) progress* progressEnergy;

В этом случае ваш init метод будет выглядеть следующим образом:

-(id)init
{
    if ( ( self = [super init] ) )
    {
        progressEnergy = [[progress alloc] init];
        [progressEnergy retain]; ///< Since it's a strong property
        [progressEnergy release]; ///< Release progressEnergy since we've hit the end of the scope we created it in
    }

    return self;
}

На самом деле, он вызывает objc_storeStrong вместо вызова retain, как я показал, но по сути это сводится к retain в этом случае.

...