5

Objective-cでは、初期化/保持/コピーしたものをすべて解放する必要があることを理解しています。returnステートメントの前にそれを行う必要がありますか?release明示的に呼び出すことを理解し、を使用しないことを望んでいますautorelease

-(void) someMethod
{
  AnotherClass* ac = [[AnotherClass alloc] init];
  if([ac somethingHappens]){
    // Do I need to release ac here?
    return;
  }
  [ac doSomethingElse];
  [ac release];
}

ありがとう!

4

2 に答える 2

3

はい、変数を解放する必要がありますが、メソッドを終了します。

それは非常に簡単です。何かを初期化すると、保持カウントがインクリメントされます。離すと減ります。ゼロになると、自動的に割り当て解除 (解放) されます。

上記のコードでは、変数を初期化しますが、戻りルートをたどると、変数の保持カウントがゼロになることはなく、したがって、割り当てが解除されることもありません。

于 2010-02-17T20:18:36.260 に答える
2

次のように割り当てられたローカル変数があるとします。

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]);

そのため、オブジェクトに割り当てる (参照される) 前に保持カウントをインクリメントし、その後、その変数をローカルで解放します。

それで全部です。

于 2011-07-22T11:32:37.520 に答える