タグ

Block構文に関するsimamikiiiのブックマーク (11)

  • Block構文の基本

    今回はBlock構文(Block Literal Syntax)についてです。最近はデリゲートよりBlockが推奨されてきているので調べてメモしようと思います。 Blockの基構文Blockの基的な使い方をまとめていきます。 宣言、代入、実行// 宣言 void (^blocksTest1)(void); // 代入 blocksTest1 = ^(void) { NSLog(@"blocksTest1"); }; // 実行 blocksTest1(); 宣言は、戻り値(^関数名)(引数) と宣言します。引数voidは()に省略可能です。 代入は、関数名の後ろにイコール(=)を入れ、^(引数){} のように行います。 実行は、関数名() のようにして呼びます。 宣言、代入を同時に行う// 宣言, 代入 void (^blocksTest2)(void) = ^(void) { NSL

  • blocksの落とし穴 - Qiita

    blocksには数多くの落とし穴があります。 しかしそれを乗り越えることができれば、非常にスマートにかける状況はそれなりに増えると思います。 ※注意:ここではARC環境での話です。一部MRCと状況が異なる場合があるかもしれません。 <blocksはObjective-cのオブジェクトをstrong参照でキャプチャする> ここでいうキャプチャとは、ポインタをコピーしている、ということです。 なんで?と思われる方も多いと思います。しかし理由ははっきりしていています。 例えば、dispatch_afterで処理を遅延することを考えてみましょう。 NSArray *sameArray = ...; int64_t delayInSeconds = 2.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSecon

    blocksの落とし穴 - Qiita
  • Objective-CのBlocksの循環参照に関する僕なりのベストプラクティス

    「Objective-CのBlocksの循環参照とその解決策」では、Blocksのメモリ管理の難しさと、世間ではよく使われている「weakSelfパターン」があまり良くないのではないかということを書きました。 このブログでは、いろいろ考えた結果たどりついた、僕が考えるBlocksの使い方を書きたいと思います。 サンプルをgithubに載せましたので、良ければそちらも参照してください。( BlocksMemoryExample ) Blocksを安全で便利に使うために必要なこと 先に、Blocksを安全で便利に使うためには、どんなことが必要なのかというのを考えておきたいと思います。 循環参照におちいらず、使用後に解放される。 使い手が内部の実装をできるだけ意識する必要がない。 おまじない的なコードを書く必要がない。 できるだけBlocksに渡すオブジェクトの存在を保証する。 そして、Bloc

    Objective-CのBlocksの循環参照に関する僕なりのベストプラクティス
  • Objective-CのBlocksの循環参照とその解決策

    半年までは、Objective-Cでコールバックの処理は、delegateを使って実装していました。しかし、delegateによるコールバックは処理の繋がりが分かりにくいというデメリットがあります。 これは皆さん感じるところだと思いますが、実際に最近のObjective-C開発は、Blocksを使って記述するのがトレンドだと思います。 ただ、メモリ管理に関して少し注意しなければならない点があるので、検証結果も合わせて記していきたいと思います。(少し長くなるので2回にわけて書きたいと思います。) Blocksで処理を行う これは簡単なサンプルです。BlocksRunnerクラスは、Blocksで渡された処理を保持し、runメソッドが呼ばれた時にその処理を実行します。 int main(int argc, const char * argv[]) { @autoreleasepool { Bl

    Objective-CのBlocksの循環参照とその解決策
  • objective-cでBlocksを使う~よくわからないクロージャーとか無名関数とか~ – 因果日記+

    豆腐VSこんにゃくという夏コミ向けの作品を作ってる時に思ったのですが、シューティングゲームでは匿名メソッドとかCommandパターンとかやたら使うよな?俺だけ? 匿名メソッドとか匿名クラスとかラムダ式とかdelegate文とかBlocksとかクロージャーとか関数ポインタとか無名関数とかプロシージャとか色々まとめてここでは「動作をオブジェクト化する手法」についてちょっくら説明してみます。言語によって、似たような手法を実現するための方法が違うので、ここでは代表して「関数オブジェクト」と呼ぶことにします。要はメソッドという手続きを変数に代入できたら便利じゃね? 例えば、シューティングで「敵がたまにぶつかったらHPを減らして、HPが0以下になったら的に応じた撃ち返し弾を発生させて・・・」というのを普通に記述するとこんなかんじでしょうか。 [java] class Enemy{ void hit()

    objective-cでBlocksを使う~よくわからないクロージャーとか無名関数とか~ – 因果日記+
  • BlockからSelector(メソッド)を作る - Qiita

    そんなに使い所はなさそうだけど。 performSelector メソッドのように、SEL 型のオブジェクトを引数に指定しないといけない場合、メソッドは予め用意しておく必要がある。

    BlockからSelector(メソッド)を作る - Qiita
  • Blocksとdelegateの基本 - Qiita

    @adachi_cです。 今日はBlocksとdelegateのわりと基的な話をしようと思います。まず、言いたいこと。 delegateで書いていたところをBlocksで書くことで、だいたいコードの量が減るのでできるだけdelegateやめましょう。 @propertyも減らしましょう。後任の人ができたときに見づらくてもうかなわないのでこれは私からお願いです。あと、dispatch_async+@propertyでカジュアルな書き換え/参照の合わせ技もやめて欲しい感じですね。 モデルでシングルトンで書けるところはもうシングルトンでお願いします。UIの更新もBlocksでいいのでは。 とりあえず、このへんのことをスッキリやれるのがBlocksとGCDなんで、その辺のことに2日アドベントカレンダーをいただいて、皆さんに説明できたらいいなと。 たとえば、キーパッドのビューコントローラがあって、

    Blocksとdelegateの基本 - Qiita
  • Cocoaの日々: 10分でおぼえるBlocksの書き方

    iOS/iPhone/iPad/MacOSX プログラミング, Objective-C, Cocoaなど Blocksが使えるようになってはや数年。未だに書式が覚えられないわたし(あなた)の為に書き方をまとめてみた。 基型 戻り値 (^名前) (引数)(私が勝手に決めた)基型はこれ。これを覚えないことには始まらない。とにかくこれだけは覚える。 戻り値と引数は一般的なCの関数の書き方と同じなので、名前の書き方だけ (^名前) になったと覚えるのがいい。 (例)BOOL (^completion)(BOOL canceled) = ...;この基型を元に各場面でどう使うかを見ていく。 変数宣言・typedef宣言 変数宣言なら 戻り値 (^名前) (引数) = …;typedef宣言なら typedef 戻り値 (^名前) (引数);両方とも基型がそのまま使える。 (例)type

    Cocoaの日々: 10分でおぼえるBlocksの書き方
  • Cocoaの日々: NSTimer を Blocks で処理する

    iOS/iPhone/iPad/MacOSX プログラミング, Objective-C, Cocoaなど 調子に乗って今度は NSTimer に Blocks を導入してみた。 利用イメージはこんな感じ。 [NSTimer scheduledTimerWithTimeInterval:1.0 block:^(NSTimer* timer, id userInfo) { self.counterLabel.text = [NSString stringWithFormat:@"%d", counter++]; } userInfo:nil repeats:YES]; 実装 NSTimer のカテゴリとして実装した。NSTimer 発火時に呼ばれるメソッドを受け取るインスタンスが必要になるが、今回は NSTimerクラスとした(つまりクラスメソッドを呼び出させる)。このあたりは少々違和感はある

    Cocoaの日々: NSTimer を Blocks で処理する
  • Objective-Cのブロック構文をメソッドの引数にする | 秋山ブログ

    Objective-Cのブロック構文をメソッドの引数にする | 秋山ブログ
  • Cocoaの日々: 遅延実行を Blocksで記述する

    iOS/iPhone/iPad/MacOSX プログラミング, Objective-C, Cocoaなど 数秒後に指定した Blocks を実行するメソッドを作ってみた。利用イメージはこんな感じ。 [self performBlock:^(void) { self.label.text = @"DONE-4"; } afterDelay:4]; performSelector:withObject:afterDelay: NSObject には数秒後に指定したメッセージを投げるメソッドが用意されている。 NSObject Class Reference - performSelector:withObject:afterDelay: これを利用して渡された Blocksを実行するメソッドを用意する。今回は NSObject のカテゴリとして実装してみた。 こんな感じ。 @interface

    Cocoaの日々: 遅延実行を Blocksで記述する
  • 1