2012-02-29 12 views
0

私の質問はプロパティの解放についてのダースのようですが、私が探している正確な答えは見つかりません。プロパティを使用して宣言され合成されていない(非原子的な)合成プロパティの解放

保持します。

@property (nonatomic, retain) NSString * myString; 

その後、

@synthesize myString; 

それは操作を保持し、解放するとゲッターとセッターを生成します。はい。

もちろん、プロパティはdeallocで解放する必要があります。

-(void)dealloc { 
    [myString release]; 
    myString = nil; 
    [super dealloc]; 
} 

これはクリーンです。

しかし、myStringを使用しないとどうなりますか?あらかじめ初期化されていますか?私の意見は、myStringの保持カウントは0になります。しかし、deallocでmyStringを解放すると、それが減少してアプリケーションがクラッシュすることになりますか?しかし、それはクラッシュしません!

もっとクリーンな方法ですか?

if(myString != nil) { 
    [myString release]; 
    myString = nil; 
} 

答えて

2

重要なことは、メッセージをnilに送信できることです。そうではありません。あなたの後者のアプローチは、よりクリーンでなく、ただ不必要です。

myStringを使用しない場合は、何も初期化されません。残っていない。あなたがそれをリリースすると、実際には何もしません[nil release]を効果的にやっています。したがって、クラッシュはありません。

1

nilを確認する必要はありません。 nilオブジェクトにリリースを送信しても何も起こりません。そのため、なぜチェックしますか?

オブジェクトのインスタンスが作成されると、initメソッドのいずれかで初期化しない限り、プロパティはnilに設定されます。

メソッドで作成する変数と同じではなく、無効なメモリを指すことがあります。したがって、これらをnilに設定することは安全な方法です。これはプロパティには必要ありません。

1

リリースメッセージを目的に応じてnilオブジェクトに送信できます。このようにしても何も起こりません。私はアプリケーションがクラッシュしないことを意味します。オブジェクトをnilに設定した背景にあるアイデアは、複数スレッドの場合、インスタンス変数が解放される前にのみ読み込まれることを常に保証するわけではないので、オブジェクトがマルチスレッド環境で使用されるときに便利です。

0

@property(retain/copy) & @synthesizenilを確認する必要はありません。それはクラッシュしないでくださいまたはEXC_BAD_ACCESSをスローしません。

これを使用していない場合は、変数がnilかどうかをチェックする必要があります。変数がnilの場合はクラッシュします。

関連する問題