自动引用计数问题:将保留对象分配给unsafe_unretained变量;对象将在分配后释放

时间:2012-03-05 22:40:33

标签: objective-c object automatic-ref-counting alloc

我收到了这个警告

  

“自动引用计数问题:将保留对象分配给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 个答案:

答案 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