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

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

«Проблема автоматического подсчета ссылок: назначение сохраненного объекта переменной 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;

но не повезло

Не могли бы вы помочь мне понять, что не так?


person zeroonnet    schedule 05.03.2012    source источник


Ответы (2)


Изменять

@property (assign) progress* progressEnergy;

to

@property (strong) progress* progressEnergy;

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

person Wevah    schedule 05.03.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.

person mattjgalloway    schedule 05.03.2012