2011-08-13 7 views
1

私はこのようなオブジェクトを解放する方法を学びました。リリースオブジェクトの正しい順序は何ですか?

NSMutableString *string1 = [[NSMutableString alloc]initWithFormat:@"ABCDEF"]; 
: 
progress some code. 
: 
string1 = nil; 
[string1 release]; 

質問は以下のとおりです。

string1 = nil; < =文字列1のポインタをなくし、nilを割り当てます。

[string1 release]; < = string1受信者にメッセージを送信できますか?

  1. string1 = nil;

    [string1 release];

  2. [string1 release];

    string1 = nil;

    正しいシーケンスは何ですか?

    [追加の質問..]

    それはカスタムメソッドであるオブジェクトの@property(NSStringの、NSNumner、NSArrayのを...)を宣言することは可能ですか?

答えて

3

これは実際に行っていることを達成するものではありません。 Objective Cでは、メッセージを無制限のオブジェクトポインタに送ることができるので、動作するように見えます。あなたの例では、割り当てられたメモリへのポインタが失われているので正しいので、未リリースのままにしておきます。

これを行う正しい方法は、文字列のreleaseを呼び出してから、それをnil(例の2番目のシナリオ)に設定することです。余談として


string1のが保持キーワードでクラスのプロパティだった場合、あなたはこのような何かができることに注意してください:

self.string1 = nil; 

をそして、これが実際に変数を解放します。これは、合成に関連する実装の詳細に依存しているので、元の質問を心配する必要はありません。ちょうど面白いサイドノート。

2

#2は正しいシーケンスです。最初に割り当てたオブジェクトを解放し、ポインタをnilに設定して、それ以降は何もしないようにします(今は信頼できないアドレス)。

#1では、一度ポインタをnilに設定すると、実際のオブジェクトを指していないので、(nil)ポインタにreleaseを呼び出してもエラーは発生しませんが、何もしません。

0

パーセプションの説明についての追加情報。合成されたセッターは(@property (nonatomic, copy) NSString *stringのために)多少、次のようなコードを生成します。

文字列が現在の値 testを持っているでしょうし、値 nilをNEWSTRING、その文字列が解放されるだろうと何のコピーは行われないだろう今
- (void)setString:(NSString *)newString 
{ 
    if ([string isEqualToString:newString]) return; 

    [string autorelease]; 
    string = [newString copy]; 
} 

copyメッセージがnilに送信されるためです。このため、self.string = nilは文字列を適切に解放し、同時にnilへのポインタを設定します。

+0

カスタムメソッドのオブジェクト(NSString、NSNumner、NSARRAY ...)の@propertyを宣言できますか? –

+0

合成メソッド(ゲッター/セッター)をオーバーライドできるかどうか疑問に思いますか?はい、できます。 –

関連する問題