オブジェクトを作成して所有権を取得する必要がある場合は、次のように記述します
NSObject *someObject = [[NSObject alloc] init];
その後、someObject
の保持カウントは 1 に等しくなります。どのメソッドがカウントを増やしますか、alloc
またはinit
で、Apple のドキュメントのどこでこの動作が説明されていますか?
オブジェクトを作成して所有権を取得する必要がある場合は、次のように記述します
NSObject *someObject = [[NSObject alloc] init];
その後、someObject
の保持カウントは 1 に等しくなります。どのメソッドがカウントを増やしますか、alloc
またはinit
で、Apple のドキュメントのどこでこの動作が説明されていますか?
その後、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];
。
メソッドは実際のalloc
割り当てを行うため、通常*保持カウントが増加します。はinit
、割り当て後にオブジェクトを初期化する責任があります。
*いくつかの基本クラスとサード パーティ コード (クラス クラスターなど) には例外がありますが、手動のメモリ管理では常に呼び出しの責任がありrelease
ます。autorelease
alloc
まあ、それはちょっと複雑です。ほとんどすべての場合、+alloc
保持カウントをインクリメントし、保持カウントに-init
は何もしません。
ただし、渡され-init
た空白のオブジェクトを初期化するのではなく、既存のオブジェクトを返したい場合があります。alloc
(NSNumber
たとえば、これを行います。)その場合、-init
を解放self
してから、保持カウントが+1の新しいオブジェクトを返します。
ARCのドキュメントで-init
は、これは受信者を「消費」し、保持されたオブジェクトを返すメソッドであると彼らは述べています。多くの場合、これはinitが保持カウントに何もしないことを意味します。しかし、時々、-init
実際にいくつかの保持を行っています。
私が言ったように+alloc
、保持をしているのはです。-init
保持されたオブジェクトを返すことが保証されていますが、ほとんどの場合、それ自体は保持を行いません。