短い答え: いいえ、この状況では自己は保持されません。
長い答え
まず第一に、自己保持と参照サイクルは同じものではありません。参照サイクルは、多数のオブジェクト間の強い参照のサイクルです。A->B->C->A は保持サイクルです。
一般的な考え方は、ブロック内で自分自身を参照している場合、このブロックを強く参照したり、強い参照のチェーンを介して参照したりしないことを常に保証したいということです。実際には、特定の条件下で保持サイクルを中断していることを確認する場合は、保持サイクルを意図的に使用できます。個人的におすすめというわけではありません。
Apple の Web サイト のドキュメントを参照してください。値がブロックでキャプチャされ、オブジェクト参照をキャプチャすると、このオブジェクトがブロックで保持されることが明確に述べられています。
基本的にこれが意味することは、ブロック内のオブジェクトを参照すると、retainCount が 1 増加し、このブロックの割り当てが解除されると、retainCount が 1 減少するということです。
ただし、ブロック内で __weak ポインターを使用する場合、保持カウントは変更されません。
次に例を示します。
- (void) doSomething {
NSLog(@"%@", self);
}
- (void) callBlock {
__weak typeof(self) weakSelf = self;
dispatch_block_t block = ^{
[weakSelf doSomething];
};
}
これを記述すると[obj method:params]
、実際には次の呼び出しに変換されます:
objc_msgSend(obj, @selector(method:), params)
. Objective-C の機能の 1 つは、nil ポインターでメソッドを呼び出すと、nil を返すことです。objc_msgSend(nil, @selector(anyselector), ...)
これは、 が常に nil を返すという事実によって保証されます。SEL は単なる const char[] であるため、保持カウントには決して影響しないことに注意してください。
したがって、ブロックが実行されるとき、オブジェクトの割り当てが解除された場合、弱いweakSelf
変数は無効になり、ブロックの本体は objc_msgSending をゼロに変換します。これは、CPU サイクルをわずかに浪費する以外は何もしません。
要約すると、Objective-C メッセージング システムは、単純な関数呼び出しであるため、メソッドを呼び出してもこのオブジェクト、このメソッド、またはこのメソッドの実装が保持されないように実装されています。