2

オブジェクトはカウントを保持し、2番目の値(またはオブジェクト)を割り当てるとカウントを増やすことができることを読みました。

誰かがretainCountが増加または減少する基本的な条件についてのアイデアを教えてもらえますか(retain、alloc、releaseなしで)...

4

3 に答える 3

3

簡単な答え:いいえ

少し長いもの:

通常、保持カウントを変更することが期待されるユーザー側のアクションは、、、retainおよび名前にまたはが含まれるメソッドの呼び出しです。ただし、場合によっては、実装上の理由からそうしない場合がありますが、代わりに別のことを行います。また、コレクションにオブジェクトを追加するなど、自分のビジネスではない方法で保持カウントを変更する可能性のある、他にも多くのことができます。releaseautoreleasenewcopy

保持カウントを使用したり、依存したりしないでください。これらは実装の詳細です。 あなたの懸念はあなた自身の所有権を管理することです。それはあなたが上記の方法のセマンティクスを介して行います。それがボンネットの下の保持数にどのように影響するかは、見ていなくてもよいことです。

しないでください。

保持数を気にすることは、ほとんどの場合、バグを解決するのではなく、バグを引き起こす方法です。

于 2010-11-23T09:23:07.810 に答える
3

オブジェクトの保持数は、心配する必要のない実装の詳細です。オブジェクトの所有権を取得および喪失する場合にのみ、実際に気にする必要があります。理由は次のとおりです。

+alloc保持カウントが1のオブジェクトを返します。ただし、すぐにinitメッセージを送信すると、まったく異なるオブジェクトが返される可能性があります。例えば

NSString* foo = [[NSString alloc] initWithString: @"foo"];

保持カウントが1のオブジェクトを提供しますよね?Cocoaの現在の実装が間違っています。+ allocによって返された文字列はすぐに解放され、代わりに@"foo"への参照が返されます。@"foo"の保持カウントはですINT_MAX

オブジェクトを保持すると、保持数が増えますよね?おそらく、しかし、ここでも、retainを定数文字列に送信しても効果はなく、一部のシングルトンには、retainのnul実装もあります。

同様に、リリースは通常、保持カウントに影響を与えますが、必ずしも同じ理由であるとは限りません。

コピーを送信すると、保持カウントが1の新しいオブジェクトが得られますか?間違い。不変オブジェクトは、保持を送信してから返すことにより、コピーを実装できます。ほとんどの場合、それは保持カウントに1を追加しますが、もちろん文字列定数では、何も起こりません。

所有権の保持と解放の観点から考えると、私が今言ったすべてのものは、実装の詳細とは無関係になります。

于 2010-11-23T11:26:28.360 に答える
2

オブジェクトのretainCountは、次の場合に変更されます。

  • オブジェクト(newまたはalloc、copyまたはmutablecopy)を作成すると、保持カウントは1になります。

  • オブジェクトに保持メッセージを送信すると、その保持カウントが
    1ずつ増加します。

  • オブジェクトにリリースメッセージを送信すると、その保持カウントが
    1デクリメントされます。

  • 自動解放メッセージをオブジェクトに送信すると、その保持カウントは1ずつ減少します(
    解放の場合のようにすぐにではなく、将来のある時点で)

この投稿を表示して、iPhoneでのメモリ管理の仕組みに関する詳細情報を入手できます。

于 2010-11-23T09:26:49.400 に答える