Ответ 1
Изменить
@property (assign) progress* progressEnergy;
к
@property (strong) progress* progressEnergy;
поэтому ваш myObject
сохраняет объект progress
.
Я получаю это предупреждение
"Автоматическая ошибка подсчета ссылок: присвоение сохраненного объекта переменной 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;
но не повезло
Не могли бы вы помочь мне выяснить, что не так?
Изменить
@property (assign) progress* progressEnergy;
к
@property (strong) progress* progressEnergy;
поэтому ваш myObject
сохраняет объект progress
.
Ну, это предупреждает вас, что вы назначаете значение, которое должно быть выпущено в конце охватывающей области, что является следующей строкой. Так вот, ваш 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 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
в этом случае.