4

オブジェクトを作成して所有権を取得する必要がある場合は、次のように記述します

NSObject *someObject = [[NSObject alloc] init];

その後、someObjectの保持カウントは 1 に等しくなります。どのメソッドがカウントを増やしますか、allocまたはinitで、Apple のドキュメントのどこでこの動作が説明されていますか?

4

3 に答える 3

12

その後、someObjectのretainCounterは1になります。問題は、retainCounterのallocまたはinitを増加させる方法と、Appleのドキュメントにこの動作が記載されていることです。

「どちらでもない」、「両方」、または「どちらか一方」がすべて正解です。より良い答えは、「それは実装の詳細であり、実装に依存しない一般的なルールに焦点を当てる必要がある」です。

まず、絶対保持カウントの概念を捨てます。これを考えるのは無駄な方法です。

+alloc保持カウントが +1 のオブジェクトを返します。によって返されるものは何でも、どこかに dする+alloc必要があります。-release実際の保持カウントが 1 であるかどうかは完全に実装の詳細であり、多くの Apple のクラスでは 1 ではないことがよくあります。

-initメッセージ化されたオブジェクトの保持カウントを消費し、保持カウント +1 (1 ではなく「プラス 1」) のオブジェクトを生成します。から返される結果は、正しく管理されるinit必要があります。release

多くの場合、保持カウントを内部的に操作せずにinit単純に呼び出します。return self;これにより、上記のルールが保持されます。

ただし、そうでない場合もあります。そのためself = [super init]、イニシャライザに常に (もちろん戻り値をチェックする必要があります)必要があり、 のようなことを決して行うべきではありませFoo *f = [Foo alloc]; [f init];

于 2012-04-20T22:18:11.827 に答える
11

メソッドは実際のalloc割り当てを行うため、通常*保持カウントが増加します。はinit、割り当て後にオブジェクトを初期化する責任があります。

*いくつかの基本クラスとサード パーティ コード (クラス クラスターなど) には例外がありますが、手動のメモリ管理では常に呼び出しの責任がありreleaseます。autoreleasealloc

于 2012-04-20T21:05:53.397 に答える
5

まあ、それはちょっと複雑です。ほとんどすべての場合、+alloc保持カウントをインクリメントし、保持カウントに-initは何もしません。

ただし、渡され-initた空白のオブジェクトを初期化するのではなく、既存のオブジェクトを返したい場合があります。allocNSNumberたとえば、これを行います。)その場合、-initを解放selfしてから、保持カウントが+1の新しいオブジェクトを返します。

ARCのドキュメントで-initは、これは受信者を「消費」し、保持されたオブジェクトを返すメソッドであると彼らは述べています。多くの場合、これはinitが保持カウントに何もしないことを意味します。しかし、時々、-init実際にいくつかの保持を行っています。

これが混乱する場合でも、心配する必要はありません。

私が言ったように+alloc、保持をしているのはです。-init保持されたオブジェクトを返すことが保証されていますが、ほとんどの場合、それ自体は保持を行いません。

于 2012-04-20T21:17:32.227 に答える