タグ

Objective-CとBlocksに関するBowz13のブックマーク (13)

  • 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] BlockとGCD « Sweden::erasmusLife

    block blockはコード中のブロックのこと. caretと呼ばれる”^”から始まる. 関数外のローカル変数を使えるがread only. が,ローカル変数を __blockをつけて宣言していれば,書き換えることも可能. e.g. __block BOOL something = NO; こうするとブロック内でYESに書き換えられる. typedefすると便利. double型の引数を1つとり,返り値がdoubleであるブロックオブジェクトの型に unary_opeartion_tをつけるには次のようにする. typedef double (^unary_opeartion_t)(double op); そうすると, unary_operation_t square; square = ^(double operand) { return operand * opera

  • 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でBOOL使ったらハマった夏。 - このブログは証明できない。

    明日までにある程度作りたいと思っていたのですが、いろいろとトラップが多くて微妙な感じです。うなぎべたいですね。Objective-CのBlocksを実践で使いました。使う意味はないのですが、遊び心です。 こんな感じで書いてみると、コンパイル通りません。 BOOL(^isUser)(NSString *) = ^(NSString *name) { return [name isEqualToString:@"foo"] || [name isEqualToString:@"bar"]; }; YES || NOとか書くと、BOOLじゃなくてintとして扱われるみたいです。普通のメソッドだと、大丈夫です。極端な話、普通のメソッドだと、0とか1とかintを返してもコンパイルは通るのです。 - (BOOL)isUser:(NSString *)name { return [name isEqu

  • Blocksの罠 | Shamrock Records Blog

    プログラムのコーディングについて書くのはプロである以上責任もあるのであんまり書かないようにしてるんですよね。 でもちょっと気をつけなきゃいけない内容があったので書いてみたいと思います。 以下のコードを見て下さい。 @interface MyViewController () { NSInteger myInteger ; } @property (nonatomic, retain) NSMutableArray* myArray ; @end @implementation MyViewController - (void)awakeFromNib { [super awakeFromNib] ; self.myArray = [NSMutableArray array] ; NSNotificationCenter* defaultCenter = [NSNotificationCe

  • C/Objective-C + Blocks でクロージャ - TrashSUITE

    Blocks というのは Apple が C/C++/Objective-C 向けに独自実装したクロージャ的な機能.Snow Leopard リリース時に GCD すげぇ!という記事で見かけて『Apple やりやがった,あの変態やりやがった』くらいにしか思っていなかったのだけど,iPhone OS4.0 で使うことになりそうなので,ザックリと調べてみた ザクザクっとドキュメントを読みつつテストしつつという状態で書いたメモなので,嘘を書いている可能性が大いにある! 以下,Blocks をクロージャと呼ぶ シンプルに // 無名でダイレクトに呼ぶ ^(void) {puts("closure");}(); //=> closure ^() {puts("closure");}(); //=> closure ^{puts("closure");}(); //=> closure // 名前を付

  • モダンなObjective-Cプログラミング

    Summary 新リテラル - NSNumberリテラル,Boxed Expression, NSArrayリテラル,NSDictionaryリテラル, 添字アクセス コンパイラがメモリ管理を肩代わり - ARC (Automatic Retain Count) Cでも無名関数 - Blocks マルチスレッドプログラミングを簡単に - GCD (Grand Central Dispatch) Bundlerライクなライブラリ管理 - CocoaPods はじめに Objective-C のプログラミング環境はどんどん良くなってる コーディングを楽に エンバグの軽減 一方、Web上の記事や書籍のコードは古いまま 古い情報に流されないためにも、新しいコンパイラやツールの機能を確認しておこう NSNumberリテラル void main(int argc, const char *argv[]

  • Grand Central Dispatch その4 group | Objective-Audio

    前回紹介したdispatch_applyはブロックの処理が終わるまで待ってくれていましたが、dispatch_asyncは別スレッドで処理されてしまうので、どの順番で処理されるのかも分からない状態でブロックを処理させっぱなしになってしまいます。 グループというのを使えば、asyncで処理する複数のブロックをひとつのグループにまとめて、それらのブロック全部が終わったタイミングを受け取る事が出来ます。 まず、グループを作る関数がこれです。 dispatch_group_t dispatch_group_create(void); 次に、グループで処理させたいブロックを渡すのがdispatch_group_asyncです。グループはasyncオンリーでsyncはありません。 void dispatch_group_async(dispatch_group_t group, dispatch_qu

  • Grand Central Dispatch その3 apply | Objective-Audio

    前回のコードのように同じ処理をforループでキューに渡すようなとき、それ専用の関数がディスパッチには既に用意されています。dispatch_applyです。 void dispatch_apply(size_t iterations, dispatch_queue_t queue, void (^block)(size_t)); iterationsの数だけブロックをキューに渡して処理させます。ブロックはsize_tの引数を一つだけ持ち、よくあるforループと同じように0から1ずつ増やした値が渡されます。 まずは、サンプルコードです。 #include <stdio.h> #include <dispatch/dispatch.h> int main (int argc, const char * argv[]) { dispatch_queue_t queue = dispatch_ge

    Bowz13
    Bowz13 2013/04/21
    Grand Central Dispatch その3 apply
  • Grand Central Dispatch その2 Queue | Objective-Audio

    Queueを作る ディスパッチの基的な使い方は、処理したいコードをブロックや関数で用意しておいて、キューにそのブロックや関数を渡すという流れになります。 ディスパッチのキューには2種類あります。アプリ(OS?)に最初から一つ用意されているグローバルキューと、自分で作るキューです。グローバルキューは並列に処理できますが、自分で作るキュー(以後シリアルキューと書いて区別します)は入れていった順番に直列でしか処理できません。 キューはdispatch_queue_tという型のオブジェクトで表されます。ディスパッチのオブジェクトは他にもいくつかありますが、それは次回以降に後回しにします。 グローバルキューを取得するにはこの関数を使います。 dispatch_queue_t dispatch_get_global_queue(long priority, unsigned long flags);

    Bowz13
    Bowz13 2013/04/21
    Grand Central Dispatch その2 Queue
  • Grand Central Dispatch その1 Block | Objective-Audio

    Grand Central Dispatchについて日語で丁寧に詳しく説明してくれるサイトはないかなぁと待っていたのですが、待っている間にひととおり自分なりに調べ終えてしまったので、まとめて書いておきます。まちがいに気がついたらご指摘いただけるとうれしいです。 Grand Central Dispatch(以下ディスパッチと書きます。リファレンスとか関数名とかGrand Centralって全然ついていなくてDispatchだけですし。)とはなんぞやというと、Snow Leopardから導入された並列処理のAPIです。並列処理といえばLeopardではNSOperationというObjective-CのAPIが導入されましたが、ディスパッチはC言語のAPIとして用意されていて、システムに近い低レベルなところで使えるものです。 あれこれ試した印象で言うと、コアが2つしかないCPUMacでた

    Bowz13
    Bowz13 2013/04/21
    Grand Central Dispatch その1 Block
  • xcode Blocks を使ってコールバック

    こんにちは! 共同開発部で日々コードと戯れております、福井です。 iOS 4.0 から追加された関数オブジェクト的なものである Blocks をご存知でしょうか。この Blocks のおかげで UIView のアニメーションは劇的に書きやすくなりました。もう当に Blocks って素晴らしいですね。 アニメーション? 違う!違うよ!根的に違うよ! Blocks でやりたいのはアニメーションじゃないよ! おれは Blocks でコールバックを書きたいんだ! ということでさっそく書いてみました。 今回は MyPickerView という UIPickerView をちょっと拡張したものを作ってみます。 MyPickerView の要件はこちら ・下から出てきたり引っ込んだりする ・出てくると画面がちょっと暗くなる ・終了ボタンと完了ボタンがある ・コールバックの Blocks を受け取って

    xcode Blocks を使ってコールバック
  • 1