次のように割り当てられたローカル変数があるとします。
NSString *placeHolder = [NSString stringWithFormat:@"%@ %@",[someObject value1], [someObject value2]];
この変数を UISearchBar オブジェクトの setPlaceholder などのオブジェクト定義メソッドに渡します。
[self.theSearchBar setPlaceholder:placeHolder];
割り当てられた文字列 'placeHolder' を正しい方法で解放する方法は?
自動解放する場合:
NSString *placeHolder = [[NSString stringWithFormat:@"%@ %@",[someObject value1], [someObject value2]] autorelease];
コードは bad_exc_access で失敗します
次のように別の場所に渡された後に変数を解放することを考えている場合
[self.theSearchBar setPlaceholder:placeHolder];
[placeHolder release];
実行時例外もスローされます。
では、何が問題なのですか?
問題は保持数です。UISearchBar オブジェクトはまだ割り当てられているため、そのオブジェクトによって参照されるそのような変数を解放または自動解放しても、保持カウントは同じです
NSLog(@"Retain count before assign to refer other object %d", [placeHolder retainCount]);
[self.theSearchBar setPlaceholder:placeHolder];
NSLog(@"Retain count after referencing %d", [placeHolder retainCount]);
それで、これをどのように処理するのですか?
次のようなものを試してください
[placeHolder retain]; // retainCount +1
[self.theSearchBar setPlaceholder:placeHolder];
[placeHolder release]; // retainCount -1
私たちは何をしましたか?保持数を見てみましょう
NSLog(@"Retain count before doing retain %d", [placeHolder retainCount]);
[placeHolder retain]; // retainCount +1
NSLog(@"Retain count after retaining it %d", [placeHolder retainCount]);
そのため、オブジェクトに割り当てる (参照される) 前に保持カウントをインクリメントし、その後、その変数をローカルで解放します。
それで全部です。