あなたのdoSomething
方法では、どこblock
から来るのですか?
それに答えれば、理由がわかります。
ああ - 解説は質問を明確にします。スナークは目的を果たしました (スナークで怠惰すぎて、午前 7 時に iPhone で本当の答えを入力することができませんでした :)。
インスタンス変数は、物を入れるための単なるスロットです。そもそもそのスロットには何もありません。
あなたの場合、次を実装できます。
-(void)doSomething:(CallBackBlk )cb{
cb();
}
ただし、通常、何かを非同期で実行する場合は、コールバックが使用されます。たとえば、次のようにします。
[myObject doSomething:^{
NSLog(@"did something");
}];
その後:
-(void)doSomething:(CallBackBlk)cb {
dispatch_async(... global concurrent queue ..., ^{
... do some work ...
cb();
});
}
つまり、発生doSomething:
するとすぐに戻りdispatch_async()
ます。コールバック ブロックは、非同期操作が行われたことを知らせるコールバックに使用されます。
もちろん、インスタンス変数はまだ必要ありません。もう少し何かを行うクラスを取り上げます。ある種の比較的複雑な状態遷移エンジンにします。たとえば、平均的なインターネット ダウンローダーや計算負荷の高いシミュレーション エンジンなどです。その時点で、すべてのバックグラウンド作業を 1 つのメソッドにまとめると非常に複雑になるため、コールバック ブロックを押し込むことになります (複数ある可能性があります。プログレス アップデーター、完了ブロック、および/またはエラー ブロック)。 、たとえば) インスタンス変数にクラスの実装を機能のラインに沿ってより明確に細分化することができます。