1

私はObjectiveCに慣れていないため、メモリ管理の1つの概念を理解するのに問題があります。たとえば、クラスBarとFooがあるとします。

私が呼び出すmain関数で:

Foo *foo = [bar getFoo]; //In my bar method I return foo
[foo retain];
[foo callMethod];
[foo release];

私はこれがそれを行う正しい方法であることを知っています。しかし、別のオブジェクトから取得した後に保持する必要があるのはなぜですか。これは、返されるオブジェクトの保持カウントが0であることを意味しませんか?それで、それを使用するために1を数えるためにそれを再結合する必要がありますか?しかし、reatinカウントが0の場合、それがまだ存在していることをどのようにして知ることができますか。増分保持カウントは次の行であるため、オブジェクトメモリは再配置されないと想定できますが、マルチスレッドプログラムがある場合はどうなりますか?

4

2 に答える 2

3

クラスメソッドがオブジェクトを返すとき、それはautoreleaseあなたが気にする必要がないようにそれを返します。通常:

- (Foo *)getFoo
{
    return [[_foo retain] autorelease];
}

foo呼び出し元のメソッドの存続期間のみを使用している場合は、それを使用retainする必要はありませんautorelease。次回の実行ループまで実行されないため、コードは実際には次のようになります。

Foo *foo = [bar getFoo]; //In my bar method I return foo
[foo callMethod];

fooただし、呼び出し元のメソッドの範囲外でしばらく保持したい場合は、それを実行してからretain、しばらくしてから保持する必要がありますrelease

もう一つ; ゲッターメソッド名の規則は単に「名前」であるため、セッターはである必要がsetFooあり、ゲッターはである必要がありますfoo。命名規則を守ることは、メソッドが何をするかを、たとえば7か月の時間で知ることができ、静的分析などのツールが規則を理解するため、良い考えです。

于 2012-07-09T10:09:32.837 に答える
0

このメソッドgetFooは、保持カウントが0のオブジェクトを返しません。これは、保持カウントが+0のオブジェクトを返します。これは、次のことを意味します。

  • オブジェクトの保持カウントがnullではありません(そうでない場合、オブジェクトは存在しません)
  • また、保持カウントはメソッドの呼び出しによって変更されなかったか、変更された場合は、バランスの取れた方法で変更されました(/ / / release/とautorelease同じ数)。retainallocnewcopy

したがって、オブジェクトの存続期間は、オブジェクトがどこにどのように保持されるかに完全に依存します。メソッドの呼び出しによってオブジェクトが解放される可能性があるため、オブジェクトが有効になる期間はわかりません。

たとえば、次のコードについて考えてみましょう。

id anObject = [anArray objectAtIndex:0];
[anArray removeObjectAtIndex:0];

オブジェクトanObjectを削除したため、オブジェクトは配列によって保持されなくなりました。したがって、破壊された可能性があります(ただし、他の場所でまだ使用されているためではない可能性があります)。

alloc一般に、メソッド( copy、、、newまたは以外)からオブジェクトを取得する場合、次のretainように想定できます。

  • オブジェクトが保持されてから自動解放されるか、
  • オブジェクトは、それを返したオブジェクトによって保持されます。

したがってfoo、現在のメソッド/関数から戻るか、オブジェクトの状態を変更するメソッド/関数を呼び出すまで、オブジェクトが有効であることがわかりますbar。その後、破壊された可能性があります。

したがって、あなたの場合、retain/releaseペアを安全に省略できます。

ただし、呼び出すすべてのメソッドの実装を知らない限り、オブジェクトが解放されないことを保証することは非常に困難です。したがって、取得したすべてのオブジェクトを保持(次に解放)する方が安全な方法であり、ARC(自動参照カウント)を有効にするとコンパイラーがそれを実行します。

retainしかし、それはあなたがたくさんの/を書くことを要求するでしょう、releaseそしてあなたのコードは読み、理解しそして維持するのが難しくなるでしょう。さらに、コードを書くほど、バグが増えます(バグを書かない場合を除く)。

結論として、オブジェクトが消滅する可能性があると疑う理由がない限り、オブジェクトを保持する必要はありません。

于 2012-07-09T11:04:36.823 に答える