タグ付けされた質問 「objective-c-blocks」

ブロックはAppleによるCのクロージャーの実装であり、Objective-CおよびC ++でも使用できます。


8
「__block」キーワードはどういう意味ですか?
__blockObjective-Cのキーワードは正確にはどういう意味ですか?ブロック内の変数を変更できることは知っていますが、知りたいのですが... それは正確にコンパイラに何を伝えますか? 他に何かしますか? それだけの場合は、そもそもなぜそれが必要なのでしょうか。 ドキュメントのどこかにありますか?(私はそれを見つけることができません)。

8
ブロック内の変数をブロック外の変数に割り当てる
エラーが発生する 変数を割り当てることができません(__blockタイプ指定子がありません) ラインでaPerson = participant;。ブロックがaPerson変数にアクセスでき、変数aPersonが返されることを確認するにはどうすればよいですか? Person *aPerson = nil; [participants enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { Person *participant = (Person*)obj; if ([participant.gender isEqualToString:@"M"]) { aPerson = participant; *stop = YES; } }]; return aPerson;


7
ブロック宣言構文リスト
Objective Cのブロック構文(そして確かにCだと思います)は、よく知られていないことで有名です。ブロックを引数として渡すことは、ブロックをivarとして宣言typedefすることとは異なります。これは、ingブロックとは異なります。 クイックリファレンスとして手元に置いておくことができるブロック宣言構文の包括的なリストはありますか?

8
APIを実装するときに、ブロック内で自己をキャプチャしないようにするにはどうすればよいですか?
動作するアプリがあり、Xcode 4.2でそれをARCに変換する作業をしています。チェック前の警告の1つは、selfブロックを強くキャプチャして保持サイクルにつながることです。この問題を説明するために、簡単なコードサンプルを作成しました。私はこれが何を意味するのか理解していると思いますが、このタイプのシナリオを実装するための「正しい」または推奨される方法がわかりません。 selfはクラスMyAPIのインスタンスです 以下のコードは、私の質問に関連するオブジェクトとブロックとの相互作用のみを示すように簡略化されています MyAPIがリモートソースからデータを取得し、MyDataProcessorがそのデータを処理して出力を生成すると仮定します。 プロセッサは、進行状況と状態を伝えるためのブロックで構成されています コードサンプル: // code sample self.delegate = aDelegate; self.dataProcessor = [[MyDataProcessor alloc] init]; self.dataProcessor.progress = ^(CGFloat percentComplete) { [self.delegate myAPI:self isProcessingWithProgress:percentComplete]; }; self.dataProcessor.completion = ^{ [self.delegate myAPIDidFinish:self]; self.dataProcessor = nil; }; // start the processor - processing happens asynchronously and the processor is released in …

10
別のブロックを開始する前に、2つの非同期ブロックが実行されるまで待機する
GCDを使用する場合、2つの非同期ブロックが実行されて完了するまで待ってから、次の実行ステップに進みます。それを行う最良の方法は何ですか? 以下を試しましたが、うまくいかないようです: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ { // block1 }); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ { // block2 }); // wait until both the block1 and block2 are done before start block3 // how to do that? dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ { // block3 });

9
ブロックで「自己」のサイクルを保持
この質問はかなり基本的なものだと思いますが、ブロックに入っている多くのObjective-Cプログラマーに関係があると思います。 私が聞いたことは、ブロックはそれらとして参照されるローカル変数をconstコピーとしてキャプチャselfするため、ブロック内で使用すると、そのブロックがコピーされた場合に保持サイクルが発生する可能性があるということです。したがって、__blockブロックをselfコピーするのではなく、ブロックを強制的に直接処理するために使用することになっています。 __block typeof(self) bself = self; [someObject messageWithBlock:^{ [bself doSomething]; }]; ただの代わりに [someObject messageWithBlock:^{ [self doSomething]; }]; 私が知りたいのは次のとおりです。これがtrueの場合、醜さを回避できる方法はありますか(GCの使用は別として)?

6
enumerateObjectsUsingBlockとforを使用する場合
明らかな違いに加えて: enumerateObjectsUsingBlockインデックスとオブジェクトの両方が必要な場合に使用します enumerateObjectsUsingBlockローカル変数を変更する必要がある場合は使用しないでください(これは間違っていました。bbumの回答を参照してください) enumerateObjectsUsingBlock一般に、うまくいく場合は、より良いか悪いかと考えられますかfor (id obj in myArray)?長所/短所は何ですか(たとえば、多かれ少なかれパフォーマンスが良いなど)?

5
typedefを使用せずにブロックメソッドパラメーターを宣言する
typedefを使用せずにObjective-Cでメソッドブロックパラメーターを指定することは可能ですか?関数ポインターと同じようにする必要がありますが、中間のtypedefを使用しないと、勝つ構文を見つけることはできません。 typedef BOOL (^PredicateBlock_t)(int); - (void) myMethodTakingPredicate:(PredicateBlock_t)predicate 上記のみがコンパイルされ、これらはすべて失敗します: - (void) myMethodTakingPredicate:( BOOL(^block)(int) ) predicate - (void) myMethodTakingPredicate:BOOL (^predicate)(int) 私が試した他の組み合わせを思い出せません。


7
クロージャーを変数としてSwiftに保管する
Objective-Cでは、ブロックの入力と出力を定義し、メソッドに渡されたブロックの1つを保存して、後でそのブロックを使用できます。 // in .h typedef void (^APLCalibrationProgressHandler)(float percentComplete); typedef void (^APLCalibrationCompletionHandler)(NSInteger measuredPower, NSError *error); // in .m @property (strong) APLCalibrationProgressHandler progressHandler; @property (strong) APLCalibrationCompletionHandler completionHandler; - (id)initWithRegion:(CLBeaconRegion *)region completionHandler:(APLCalibrationCompletionHandler)handler { self = [super init]; if(self) { ... _completionHandler = [handler copy]; .. } return self; } - (void)performCalibrationWithProgressHandler:(APLCalibrationProgressHandler)handler { ... …

7
iOS 6の完了ブロックのためのdispatch_get_current_queue()の代替手段?
ブロックと完了ブロックを受け入れるメソッドがあります。最初のブロックはバックグラウンドで実行し、完了ブロックはメソッドが呼び出されたキューで実行する必要があります。 後者の場合は常に使用dispatch_get_current_queue()していましたが、iOS 6以降では非推奨のようです。代わりに何を使用すればよいですか?

4
__weak参照と__block参照の違いは何ですか?
Xcodeのドキュメントを読んでいますが、これが私を困惑させるものです。 __block typeof(self) tmpSelf = self; [self methodThatTakesABlock:^ { [tmpSelf doSomething]; }]; 以下はドキュメントからコピーされたものです。 ブロックは、キャプチャする変数への強力な参照を形成します。selfブロック内で使用する場合 、ブロックはへの強い参照を形成するため、ブロックへの強い参照もselfある場合 self(通常はそうなります)、強い参照サイクルが発生します。サイクルを回避する__blockには、上記の例のように、ブロックの外側に自分自身への弱い(または)参照を作成する必要があります。 「弱い(または__block)」の意味がわかりませんか? です __block typeof(self) tmpSelf = self; そして __weak typeof(self) tmpSelf = self; ここでもまったく同じですか? ドキュメントで別の部分を見つけました: 注:ガベージコレクション環境では、変数に__weakと__block修飾子の両方を適用すると 、ブロックはそれが存続することを保証しません。 だから、私は完全に困惑しています。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.