Soumettre la recherche
Mettre en ligne
Blocksの活用法
•
Télécharger en tant que KEY, PDF
•
10 j'aime
•
4,139 vues
Hidetoshi Mori
Suivre
Description about Blocks in Objective-C.
Lire moins
Lire la suite
Technologie
Business
Signaler
Partager
Signaler
Partager
1 sur 37
Télécharger maintenant
Recommandé
Backbone.js
Backbone.js
daisuke shimizu
Html5 Web Applications
Html5 Web Applications
totty jp
OSC京都2011
OSC京都2011
haganemetal
J qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているか
Hisashi Aruji
アップルのテンプレートは有害と考えられる
アップルのテンプレートは有害と考えられる
Brian Gesiak
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作る
Kiyoshi SATOH
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Michio Koyama
リアルFacebookガジェットを作った(ロングバージョン)
リアルFacebookガジェットを作った(ロングバージョン)
Mariko Goda
Recommandé
Backbone.js
Backbone.js
daisuke shimizu
Html5 Web Applications
Html5 Web Applications
totty jp
OSC京都2011
OSC京都2011
haganemetal
J qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているか
Hisashi Aruji
アップルのテンプレートは有害と考えられる
アップルのテンプレートは有害と考えられる
Brian Gesiak
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作る
Kiyoshi SATOH
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Michio Koyama
リアルFacebookガジェットを作った(ロングバージョン)
リアルFacebookガジェットを作った(ロングバージョン)
Mariko Goda
iOSビヘイビア駆動開発
iOSビヘイビア駆動開発
Brian Gesiak
jQuery超入門編
jQuery超入門編
Yasuhito Yabe
Try Jetpack
Try Jetpack
Hideaki Miyake
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
Koji Ishimoto
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
Akio Katayama
Pro aspnetmvc3framework chap19
Pro aspnetmvc3framework chap19
Hideki Hashizume
Active Directoryデータのプロパティ出力(Output Properties)
Active Directoryデータのプロパティ出力(Output Properties)
Michio Koyama
はじめてのVue.js
はじめてのVue.js
Kei Yagi
LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XML
ShinichiAoyagi
ゲンバのSwift
ゲンバのSwift
Yuichi Adachi
Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt)
Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt)
Kei Yagi
CoreData 非同期データ処理
CoreData 非同期データ処理
次朗 永島
はじめてのCouch db
はじめてのCouch db
Eiji Kuroda
Easy Going Groovy(Groovyを気軽に使いこなそう)
Easy Going Groovy(Groovyを気軽に使いこなそう)
Uehara Junji
Vue.js 基礎 + Vue CLI の使い方
Vue.js 基礎 + Vue CLI の使い方
Kei Yagi
Vue Router + Vuex
Vue Router + Vuex
Kei Yagi
T90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvm
伸男 伊藤
Type Safe Assets Handling in Swift
Type Safe Assets Handling in Swift
Kazunobu Tasaka
ADRという考えを取り入れてみて
ADRという考えを取り入れてみて
infinite_loop
swooleを試してみた
swooleを試してみた
Yukihiro Katsumi
Facebook api for iOS
Facebook api for iOS
Hidetoshi Mori
20130216 小ネタ集
20130216 小ネタ集
Hidetoshi Mori
Contenu connexe
Tendances
iOSビヘイビア駆動開発
iOSビヘイビア駆動開発
Brian Gesiak
jQuery超入門編
jQuery超入門編
Yasuhito Yabe
Try Jetpack
Try Jetpack
Hideaki Miyake
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
Koji Ishimoto
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
Akio Katayama
Pro aspnetmvc3framework chap19
Pro aspnetmvc3framework chap19
Hideki Hashizume
Active Directoryデータのプロパティ出力(Output Properties)
Active Directoryデータのプロパティ出力(Output Properties)
Michio Koyama
はじめてのVue.js
はじめてのVue.js
Kei Yagi
LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XML
ShinichiAoyagi
ゲンバのSwift
ゲンバのSwift
Yuichi Adachi
Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt)
Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt)
Kei Yagi
CoreData 非同期データ処理
CoreData 非同期データ処理
次朗 永島
はじめてのCouch db
はじめてのCouch db
Eiji Kuroda
Easy Going Groovy(Groovyを気軽に使いこなそう)
Easy Going Groovy(Groovyを気軽に使いこなそう)
Uehara Junji
Vue.js 基礎 + Vue CLI の使い方
Vue.js 基礎 + Vue CLI の使い方
Kei Yagi
Vue Router + Vuex
Vue Router + Vuex
Kei Yagi
T90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvm
伸男 伊藤
Type Safe Assets Handling in Swift
Type Safe Assets Handling in Swift
Kazunobu Tasaka
ADRという考えを取り入れてみて
ADRという考えを取り入れてみて
infinite_loop
swooleを試してみた
swooleを試してみた
Yukihiro Katsumi
Tendances
(20)
iOSビヘイビア駆動開発
iOSビヘイビア駆動開発
jQuery超入門編
jQuery超入門編
Try Jetpack
Try Jetpack
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
Pro aspnetmvc3framework chap19
Pro aspnetmvc3framework chap19
Active Directoryデータのプロパティ出力(Output Properties)
Active Directoryデータのプロパティ出力(Output Properties)
はじめてのVue.js
はじめてのVue.js
LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XML
ゲンバのSwift
ゲンバのSwift
Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt)
Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt)
CoreData 非同期データ処理
CoreData 非同期データ処理
はじめてのCouch db
はじめてのCouch db
Easy Going Groovy(Groovyを気軽に使いこなそう)
Easy Going Groovy(Groovyを気軽に使いこなそう)
Vue.js 基礎 + Vue CLI の使い方
Vue.js 基礎 + Vue CLI の使い方
Vue Router + Vuex
Vue Router + Vuex
T90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvm
Type Safe Assets Handling in Swift
Type Safe Assets Handling in Swift
ADRという考えを取り入れてみて
ADRという考えを取り入れてみて
swooleを試してみた
swooleを試してみた
En vedette
Facebook api for iOS
Facebook api for iOS
Hidetoshi Mori
20130216 小ネタ集
20130216 小ネタ集
Hidetoshi Mori
コンシューマアプリを作るということ
コンシューマアプリを作るということ
Hidetoshi Mori
20130216 magical record
20130216 magical record
Hidetoshi Mori
Storyboard
Storyboard
Hidetoshi Mori
Evernote連携
Evernote連携
Hidetoshi Mori
Photo mosaic 検証
Photo mosaic 検証
Hidetoshi Mori
Framerで始めるプロトタイプコーディング
Framerで始めるプロトタイプコーディング
masaaki komori
プロジェクト管理しないという提案
プロジェクト管理しないという提案
Hidetoshi Mori
最適化超入門
最適化超入門
Takami Sato
How to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & Tricks
SlideShare
Getting Started With SlideShare
Getting Started With SlideShare
SlideShare
En vedette
(12)
Facebook api for iOS
Facebook api for iOS
20130216 小ネタ集
20130216 小ネタ集
コンシューマアプリを作るということ
コンシューマアプリを作るということ
20130216 magical record
20130216 magical record
Storyboard
Storyboard
Evernote連携
Evernote連携
Photo mosaic 検証
Photo mosaic 検証
Framerで始めるプロトタイプコーディング
Framerで始めるプロトタイプコーディング
プロジェクト管理しないという提案
プロジェクト管理しないという提案
最適化超入門
最適化超入門
How to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & Tricks
Getting Started With SlideShare
Getting Started With SlideShare
Similaire à Blocksの活用法
Ll xcode
Ll xcode
Net Kanayan
Swiftyを試す
Swiftyを試す
幸雄 村上
ハイブリッドアプリへのLocalytics導入ガイド
ハイブリッドアプリへのLocalytics導入ガイド
LocalyticsJP
Mvc conf session_4_ono
Mvc conf session_4_ono
Hiroshi Okunushi
20110607
20110607
小野 修司
Spring mvc
Spring mvc
Ryo Asai
iOS WebView App
iOS WebView App
hagino 3000
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
Fumiya Sakai
20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会
Yukihiro Kitazawa
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
Akio Katayama
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Shotaro Suzuki
Wicket勉強会2
Wicket勉強会2
Yoichiro Tanaka
JavaFX 2.0 - リッチクライアントのためのUI基盤
JavaFX 2.0 - リッチクライアントのためのUI基盤
Yuichi Sakuraba
OpenGLプログラミング
OpenGLプログラミング
幸雄 村上
Google App Engine for Java
Google App Engine for Java
Takuya Tsuchida
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
Fujio Kojima
LabVIEW NXG Web Module Training Slide
LabVIEW NXG Web Module Training Slide
Yusuke Tochigi
Cakephp2.1 ViewBlock view-inheritance
Cakephp2.1 ViewBlock view-inheritance
Kohji Tanaka
20120422i phonedeveloperworkshoppublished
20120422i phonedeveloperworkshoppublished
Yoichiro Sakurai
WKWebViewとUIWebView
WKWebViewとUIWebView
Yuki Hirai
Similaire à Blocksの活用法
(20)
Ll xcode
Ll xcode
Swiftyを試す
Swiftyを試す
ハイブリッドアプリへのLocalytics導入ガイド
ハイブリッドアプリへのLocalytics導入ガイド
Mvc conf session_4_ono
Mvc conf session_4_ono
20110607
20110607
Spring mvc
Spring mvc
iOS WebView App
iOS WebView App
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Wicket勉強会2
Wicket勉強会2
JavaFX 2.0 - リッチクライアントのためのUI基盤
JavaFX 2.0 - リッチクライアントのためのUI基盤
OpenGLプログラミング
OpenGLプログラミング
Google App Engine for Java
Google App Engine for Java
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
LabVIEW NXG Web Module Training Slide
LabVIEW NXG Web Module Training Slide
Cakephp2.1 ViewBlock view-inheritance
Cakephp2.1 ViewBlock view-inheritance
20120422i phonedeveloperworkshoppublished
20120422i phonedeveloperworkshoppublished
WKWebViewとUIWebView
WKWebViewとUIWebView
Plus de Hidetoshi Mori
Git超入門
Git超入門
Hidetoshi Mori
20130515 diary euglena_en
20130515 diary euglena_en
Hidetoshi Mori
Nodejsによるapiサーバ構築事例
Nodejsによるapiサーバ構築事例
Hidetoshi Mori
mongodbの簡易ストレージ化
mongodbの簡易ストレージ化
Hidetoshi Mori
汎用apiサーバの構築
汎用apiサーバの構築
Hidetoshi Mori
UITableViewで無限CoverFlowを作る
UITableViewで無限CoverFlowを作る
Hidetoshi Mori
モバイルビジネスの動向
モバイルビジネスの動向
Hidetoshi Mori
インタラクションデザインの考察
インタラクションデザインの考察
Hidetoshi Mori
モバイルビジネスの動向
モバイルビジネスの動向
Hidetoshi Mori
サービス開発における工程
サービス開発における工程
Hidetoshi Mori
ゲリラ的サービスの育て方
ゲリラ的サービスの育て方
Hidetoshi Mori
インタラクションデザインの考察
インタラクションデザインの考察
Hidetoshi Mori
Presentation of TapkuLibrary
Presentation of TapkuLibrary
Hidetoshi Mori
Facebook API for iOS
Facebook API for iOS
Hidetoshi Mori
FacebookAPI for iOS
FacebookAPI for iOS
Hidetoshi Mori
Plus de Hidetoshi Mori
(15)
Git超入門
Git超入門
20130515 diary euglena_en
20130515 diary euglena_en
Nodejsによるapiサーバ構築事例
Nodejsによるapiサーバ構築事例
mongodbの簡易ストレージ化
mongodbの簡易ストレージ化
汎用apiサーバの構築
汎用apiサーバの構築
UITableViewで無限CoverFlowを作る
UITableViewで無限CoverFlowを作る
モバイルビジネスの動向
モバイルビジネスの動向
インタラクションデザインの考察
インタラクションデザインの考察
モバイルビジネスの動向
モバイルビジネスの動向
サービス開発における工程
サービス開発における工程
ゲリラ的サービスの育て方
ゲリラ的サービスの育て方
インタラクションデザインの考察
インタラクションデザインの考察
Presentation of TapkuLibrary
Presentation of TapkuLibrary
Facebook API for iOS
Facebook API for iOS
FacebookAPI for iOS
FacebookAPI for iOS
Dernier
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
Shota Ito
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
danielhu54
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Yuma Ohgami
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
Ryo Sasaki
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
sugiuralab
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
Atomu Hidaka
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
furutsuka
Dernier
(7)
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
Blocksの活用法
1.
Blocksの活用
iOS版 Hidetoshi Mori
2.
自己紹介 森 英寿 Facebook hidetoshi.mori Twitter: @h_mori フリーランスプログラマ
3.
自己紹介 主開発言語 Java/.net/Objective-C/Ruby/PHP アプリ開発実績 SOICHA iPhone (TweetMe) ATND暦
4.
Blocks?
? iOS4, MacOSX 10.6から導入 無名関数、クロージャ、 Lambda
5.
Blocksの利点 メソッド定義なく関数を記述できる 関数を変数のように扱える performedSelectorの代わりに使える 別のソースから処理の差込が行える まとまった処理の記述が可能
6.
Blocksの構文 ^戻り値の型(引数リスト){処理} (実装) ^NSInteger(NSInteger i){
return i++; } ^{ NSLog(@”block”); } ※戻り値の型voidと(引数無し)は省略可 戻り値の型 (^Block変数名)(引数リスト); (宣言) id (^block)(NSArray *array, NSUInteger index); void (^block)(void);
7.
Block内の自動変数 int val =
1; void (^block)(void) = ^{NSLog(@”val=%d”, val)}; val = 2; block(); //blockの実行 > val=1 Block定義時点のローカル変数がコピーされる
8.
__block指定子 __block int val
= 1; void (^block)(void) = ^{val=2)}; block(); NSLog(@”val=%d”, val); > val=2 Blockスコープを超えるには__blockを使う
9.
Blockの格納領域 グローバル(データ)領域 (グローバル変数領域) _NSConcreteGlobalBlock ヒープ領域 (オブジェクト変数領域)
_NSConcreteMallocBlock スタック領域 (ローカル変数領域) _NSConcreteStackBlock
10.
Blockのコピー Blockはプリミティブ変数らしきもの スタック領域Blockはスコープ終了後、破棄される Blockを維持するためヒープ領域に手動コピーが必要 Blockのpropertyは基本
copy で宣言する
11.
Block内変数のコピー BlockコピーでBlock内変数は浅いコピーになる ARC時 BlockはBlock内変数の__strong参照を保持 非ARC時 Blockは__blockがないBlock内変数をretainする
12.
Blockによる循環参照 BlockのBlock内変数への強参照による循環参照 @property (retain) NSMutableArray
array; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -(void)addBlock { id block = ^{ [self method]; self array }; [array addObject block]; } block
13.
Blockによる循環参照回避 BlockのBlock内変数への参照を弱参照にする @property (retain) NSMutableArray
array; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -(void)addBlock { __block __weak MyClass *weakSelf = self; id block = ^{ self array [weakSelf method]; }; [array addObject block]; } block
14.
循環参照の予防策 deallocにサウンドBreakPointを設定
15.
BlocksKitの紹介 BSD, MITライセンス iOS4、MacOSX 10.6以上 A2DynamicDelegateが必要
16.
A2DynamicDelegateの紹介 AssociatedObjectを利用した動的な読込を可能にする 動的なインスタンス変数の差し込み 動的なプロトコルの差し込み カテゴリでインスタンス変数のような仕組みを作れる
17.
BlocksKitの導入手順 BlocksKit/A2DynamicDelegate/に2クラスをコピー A2BlockDelegaete、A2DynamicDelegate 自分のプロジェクトにBlocksKit.xcodeprojを追加 libBlocksKit.a、MessageUI.frameworkを追加 その他リンカフラグに「-ObjC
-all_load」を追加 ヘッダ検索パスに/BlocksKit**を設定 pchにBlocksKit/BlocksKit.hをimport
18.
BlocksKitの便利メソッド UIActionSheet#addButtonWithTitle:handler: - (void)showSheet1 {
UIActionSheet *sheet1 = [UIActionSheet actionSheetWithTitle:@"Sheet"]; if (condition1) { [sheet1 addButtonWithTitle:@"Action1" handler:^(void) { //Action1の処理 }]; } [sheet1 setCancelButtonIndex:[sheet addButtonWithTitle:@"Close"]]; [sheet1 showInView:self.view]; }
19.
BlocksKitの便利メソッド UIAlertView#addButtonWithTitle:handler: UIAlertView *alert = [UIAlertView
alertViewWithTitle:@"Alert" message:@"UIAlertView Test"]; [alert addButtonWithTitle:@"Action" handler:^(void) { NSLog(@"Action"); }]; [alert addButtonWithTitle:@"Close"]; [alert show];
20.
BlocksKitの便利メソッド NSURLConnection#startConnectionWithRequest:successHandler: NSURLRequest *req = [NSURLRequest
requestWithURL:[NSURL URLWithString:@"http://d.hatena.ne.jp/h_mori/"]]; [NSURLConnection startConnectionWithRequest:req successHandler:^(NSURLConnection *con, NSURLResponse *res, NSData *data){ NSString *html = [[[NSString alloc] initWithData:data encoding:NSJapaneseEUCStringEncoding] autorelease]; NSLog(@"html=%@", html); } failureHandler:^(NSURLConnection *con, NSError *err){ NSLog(@"NSURLConnection failed : %@", [err localizedDescription]); }];
21.
BlocksKitの便利メソッド UIWebView#didFinishLoadBlock UIWebView#didFinishWithErrorBlock UIWebView *webView =
[[[UIWebView alloc] init] autorelease]; webView.didFinishLoadBlock = ^(UIWebView *v) { NSLog(@"didFinishLoadBlock"); }; webView.didFinishWithErrorBlock = ^(UIWebView *v, NSError *err) { NSLog(@"didFinishWithErrorBlock"); }; [webView.dynamicDelegate webViewDidFinishLoad:webView]; [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://d.hatena.ne.jp/h_mori/"]]];
22.
BlocksKitの便利メソッド MFMailComposeViewController#completionBlock MFMailComposeViewController *ctl = [[[MFMailComposeViewController
alloc] init] autorelease]; ctl.mailComposeDelegate = self; ctl.completionBlock = ^(MFMailComposeViewController *controller, MFMailComposeResult result, NSError *err){ if (result == MFMailComposeResultSent) { //成功時の処理 } }; [self presentModalViewController:ctl animated:YES];
23.
BlocksKitの便利メソッド UIControl#addEventHandler:forControlEvents: UIButton *button =
[UIButton buttonWithType:UIButtonTypeRoundedRect]; button.frame = CGRectMake(40, 20, 240, 44); [button setTitle:@"Caption" forState:UIControlStateNormal]; [button addEventHandler:^(id sender) { //Action } forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button];
24.
BlocksKitの便利メソッド UIBarButtonItem#initWithBarButtonSystemItem:handler: self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemCancel handler:^(id sender) { //Cancel Action }] autorelease];
25.
BlocksKitの便利メソッド UIGestureRecognizer#initWithHandler: UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer
alloc] initWithHandler:^(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location){ //Swipe Action }]; [self.view addGestureRecognizer:swipe];
26.
BlocksKitの便利メソッド NSObject#performBlock: [NSObject performBlock:^(void) {
NSLog(@"fire"); } afterDelay:1];
27.
BlocksKitの便利メソッド NSTimer#scheduledTimerWithTimeInterval:block: [NSTimer scheduledTimerWithTimeInterval:1 block:^(NSTimeInterval
time) { //action every 1 sec. } repeats:YES];
28.
UITableViewのカテゴリ拡張 UITableViewはDelegate, DataSourceを利用する カテゴリはインスタンス変数を保持できない A2DynamicDelegateを使って動的に保持
29.
UITableViewの拡張 A2DynamicUITableViewDelegateの実装 -
(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { id realDelegate = self.realDelegate; if (realDelegate && [realDelegate respondsToSelector:@selector(tableView:didSelectRowAtIndexPath:)]) { [realDelegate tableView:tableView didSelectRowAtIndexPath:indexPath]; } NSString *key = [NSString stringWithFormat:@”%@_%@_%@”, kHandlerDidSelectRow, indexPath.section, indexPath.row]; BKTableViewBlock block = [self.handlers objectForKey:key]; if (block) { ((BKTableViewBlock)block)(tableView, indexPath); } }
30.
UITableViewの拡張
UITableView (BlocksKitExtends) - (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style delegate:(id)delegate dataSource:(id)dataSource { UITableView *tableView = [self initWithFrame:frame style:style]; tableView.delegate = self.dynamicDelegate; ((A2DynamicDelegate *)self.dynamicDelegate).realDelegate = delegate; tableView.dataSource = self.dynamicDataSource; ((A2DynamicDelegate *)self.dynamicDataSource).realDelegate = dataSource; return tableView; }
31.
UITableViewの拡張 UITableView
(BlocksKitExtends) typedef void (^BKTableViewBlock)(UITableView *tableView, NSIndexPath *indexPath); - (void)setHandler:(BKTableViewBlock)block forDidSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSString *key = [NSString stringWithFormat:@”%@_%@_%@”, kHandlerDidSelectRow, indexPath.section, indexPath.row]; if (block) { [[self.dynamicDelegate handlers] setObject:block forKey:key]; } else { [[self.dynamicDelegate handlers] removeObjectForKey:key]; } [self setHandler:block forKey:key target:self.dynamicDelegate]; }
32.
UITableViewの拡張
使い方 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@”Cell”]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@”Cell”] autorelease]; } if (indexPath.section == 0) { cell.textLabel.text = [_rows objectAtIndex:indexPath.row]; [tableView setHandler:^(UITableView *tv, NSIndexPath *ip){ //Cell選択時の処理 } forDidSelectRowAtIndexPath:indexPath]; } return cell; }
33.
UIViewControllerの基底拡張 UIViewControllerのView LifesycleでBlock差込を行う
loadView: viewDidLoad: viewWillAppear: viewDidAppear: viewWillDisappear: viewDidDisappear:
34.
UIViewControllerの基底拡張 BaseViewController void (^_viewWillAppearBlock)(BOOL);
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; if (_viewWillAppearBlock) { _viewWillAppearBlock(animated); } }
35.
UIViewControllerの基底拡張 画面の遷移管理に使える
callback block for B viewWillAppear: B execute block from B A callback block for C viewWillAppear: C execute block from C 利点:B,CはAを意識する必要がない(疎結合になる)
36.
まとめ Blockの活用により疎結合な構成が組みやすくなる Delegateパターンを使わなくてよくなる performedSelectorを使わなくてよくなる 循環参照に注意
37.
ご清聴ありがとうございました
m(_ _)m
Notes de l'éditeur
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
Télécharger maintenant