我收到了这个警告
“自动引用计数问题:将保留对象分配给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;
但没有运气
你能帮我弄清楚出了什么问题吗?
答案 0 :(得分:27)
更改
@property (assign) progress* progressEnergy;
到
@property (strong) progress* progressEnergy;
因此您的myObject
会保留progress
个对象。
答案 1 :(得分:9)
嗯,它警告你,你正在分配一个即将在封闭范围结束时释放的值,这恰好是下一行。所以这就是你的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
。