11

この警告が表示されます

「自動参照カウントの問題:保持されたオブジェクトを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;

しかし運がない

何が悪いのか理解するのを手伝ってくれませんか。

4

2 に答える 2

28

変化する

@property (assign) progress* progressEnergy;

@property (strong) progress* progressEnergy;

したがってmyObject、オブジェクトを保持しprogressます。

于 2012-03-05T22:45:35.923 に答える
10

次の行である、囲んでいるスコープの最後で解放されようとしている値を割り当てていることを警告しています。したがって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呼び出すのではなく呼び出しますが、基本的にこの場合はになります。retainretain

于 2012-03-05T22:47:06.030 に答える