SlideShare a Scribd company logo
Submit Search
Upload
Blocksの活用法
Report
Hidetoshi Mori
Self-Employed Consultant at home
Follow
•
10 likes
•
4,139 views
1
of
37
Blocksの活用法
•
10 likes
•
4,139 views
Download Now
Download to read offline
Report
Technology
Business
Description about Blocks in Objective-C.
Read more
Hidetoshi Mori
Self-Employed Consultant at home
Follow
Recommended
Backbone.js
daisuke shimizu
12.3K views
•
27 slides
Html5 Web Applications
totty jp
3.4K views
•
25 slides
OSC京都2011
haganemetal
2.5K views
•
66 slides
J qmobiはjqueryから軽量化しているか
Hisashi Aruji
1.1K views
•
19 slides
アップルのテンプレートは有害と考えられる
Brian Gesiak
16.8K views
•
97 slides
node+socket.io+enchant.jsでチャットゲーを作る
Kiyoshi SATOH
11.3K views
•
48 slides
More Related Content
What's hot
iOSビヘイビア駆動開発
Brian Gesiak
11.7K views
•
76 slides
jQuery超入門編
Yasuhito Yabe
1.4K views
•
43 slides
Try Jetpack
Hideaki Miyake
1.1K views
•
103 slides
JavaScript/CSS 2015 Autumn
Koji Ishimoto
18.3K views
•
131 slides
FxUG in Toyama - ASphalt2 container -
Akio Katayama
716 views
•
62 slides
Pro aspnetmvc3framework chap19
Hideki Hashizume
671 views
•
21 slides
What's hot
(20)
iOSビヘイビア駆動開発
Brian Gesiak
•
11.7K views
jQuery超入門編
Yasuhito Yabe
•
1.4K views
Try Jetpack
Hideaki Miyake
•
1.1K views
JavaScript/CSS 2015 Autumn
Koji Ishimoto
•
18.3K views
FxUG in Toyama - ASphalt2 container -
Akio Katayama
•
716 views
Pro aspnetmvc3framework chap19
Hideki Hashizume
•
671 views
Active Directoryデータのプロパティ出力(Output Properties)
Michio Koyama
•
3.2K views
はじめてのVue.js
Kei Yagi
•
2.4K views
LINQ 概要 + 結構便利な LINQ to XML
ShinichiAoyagi
•
4.9K views
ゲンバのSwift
Yuichi Adachi
•
8.2K views
Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt)
Kei Yagi
•
12.1K views
CoreData 非同期データ処理
次朗 永島
•
16.3K views
はじめてのCouch db
Eiji Kuroda
•
3.8K views
Easy Going Groovy(Groovyを気軽に使いこなそう)
Uehara Junji
•
2K views
Vue.js 基礎 + Vue CLI の使い方
Kei Yagi
•
2.5K views
Vue Router + Vuex
Kei Yagi
•
2.5K views
T90 きっと怖くないmvvm & mvpvm
伸男 伊藤
•
8.2K views
Type Safe Assets Handling in Swift
Kazunobu Tasaka
•
2.9K views
ADRという考えを取り入れてみて
infinite_loop
•
2.9K views
swooleを試してみた
Yukihiro Katsumi
•
535 views
Viewers also liked
Facebook api for iOS
Hidetoshi Mori
7.8K views
•
12 slides
20130216 小ネタ集
Hidetoshi Mori
3.4K views
•
8 slides
コンシューマアプリを作るということ
Hidetoshi Mori
3.4K views
•
15 slides
20130216 magical record
Hidetoshi Mori
3.8K views
•
10 slides
Storyboard
Hidetoshi Mori
4.7K views
•
16 slides
Evernote連携
Hidetoshi Mori
4.6K views
•
11 slides
Viewers also liked
(12)
Facebook api for iOS
Hidetoshi Mori
•
7.8K views
20130216 小ネタ集
Hidetoshi Mori
•
3.4K views
コンシューマアプリを作るということ
Hidetoshi Mori
•
3.4K views
20130216 magical record
Hidetoshi Mori
•
3.8K views
Storyboard
Hidetoshi Mori
•
4.7K views
Evernote連携
Hidetoshi Mori
•
4.6K views
Photo mosaic 検証
Hidetoshi Mori
•
430 views
Framerで始めるプロトタイプコーディング
masaaki komori
•
1.7K views
プロジェクト管理しないという提案
Hidetoshi Mori
•
2K views
最適化超入門
Takami Sato
•
174.6K views
How to Make Awesome SlideShares: Tips & Tricks
SlideShare
•
3M views
Getting Started With SlideShare
SlideShare
•
4M views
Similar to Blocksの活用法
Ll xcode
Net Kanayan
1.1K views
•
34 slides
Swiftyを試す
幸雄 村上
303 views
•
22 slides
ハイブリッドアプリへのLocalytics導入ガイド
LocalyticsJP
671 views
•
8 slides
Mvc conf session_4_ono
Hiroshi Okunushi
729 views
•
25 slides
20110607
小野 修司
511 views
•
25 slides
Spring mvc
Ryo Asai
6.4K views
•
25 slides
Similar to Blocksの活用法
(20)
Ll xcode
Net Kanayan
•
1.1K views
Swiftyを試す
幸雄 村上
•
303 views
ハイブリッドアプリへのLocalytics導入ガイド
LocalyticsJP
•
671 views
Mvc conf session_4_ono
Hiroshi Okunushi
•
729 views
20110607
小野 修司
•
511 views
Spring mvc
Ryo Asai
•
6.4K views
iOS WebView App
hagino 3000
•
14.5K views
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
Fumiya Sakai
•
349 views
20130924 Picomon CRH勉強会
Yukihiro Kitazawa
•
538 views
FxUG in Toyama - ASphalt2 container -
Akio Katayama
•
349 views
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Shotaro Suzuki
•
368 views
Wicket勉強会2
Yoichiro Tanaka
•
1.4K views
JavaFX 2.0 - リッチクライアントのためのUI基盤
Yuichi Sakuraba
•
16.7K views
OpenGLプログラミング
幸雄 村上
•
442 views
Google App Engine for Java
Takuya Tsuchida
•
5.5K views
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
Fujio Kojima
•
1.8K views
LabVIEW NXG Web Module Training Slide
Yusuke Tochigi
•
653 views
Cakephp2.1 ViewBlock view-inheritance
Kohji Tanaka
•
2.4K views
20120422i phonedeveloperworkshoppublished
Yoichiro Sakurai
•
762 views
WKWebViewとUIWebView
Yuki Hirai
•
48.2K views
More from Hidetoshi Mori
Git超入門
Hidetoshi Mori
2.5K views
•
17 slides
20130515 diary euglena_en
Hidetoshi Mori
1.2K views
•
13 slides
Nodejsによるapiサーバ構築事例
Hidetoshi Mori
5.5K views
•
32 slides
mongodbの簡易ストレージ化
Hidetoshi Mori
828 views
•
14 slides
汎用apiサーバの構築
Hidetoshi Mori
2K views
•
13 slides
UITableViewで無限CoverFlowを作る
Hidetoshi Mori
3.8K views
•
24 slides
More from Hidetoshi Mori
(15)
Git超入門
Hidetoshi Mori
•
2.5K views
20130515 diary euglena_en
Hidetoshi Mori
•
1.2K views
Nodejsによるapiサーバ構築事例
Hidetoshi Mori
•
5.5K views
mongodbの簡易ストレージ化
Hidetoshi Mori
•
828 views
汎用apiサーバの構築
Hidetoshi Mori
•
2K views
UITableViewで無限CoverFlowを作る
Hidetoshi Mori
•
3.8K views
モバイルビジネスの動向
Hidetoshi Mori
•
2.6K views
インタラクションデザインの考察
Hidetoshi Mori
•
773 views
モバイルビジネスの動向
Hidetoshi Mori
•
614 views
サービス開発における工程
Hidetoshi Mori
•
1.4K views
ゲリラ的サービスの育て方
Hidetoshi Mori
•
898 views
インタラクションデザインの考察
Hidetoshi Mori
•
879 views
Presentation of TapkuLibrary
Hidetoshi Mori
•
1.9K views
Facebook API for iOS
Hidetoshi Mori
•
6.6K views
FacebookAPI for iOS
Hidetoshi Mori
•
705 views
Recently uploaded
概念モデリングワークショップ 設計編
Knowledge & Experience
10 views
•
37 slides
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化
Knowledge & Experience
6 views
•
34 slides
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
NTT DATA Technology & Innovation
208 views
•
33 slides
さくらのひやおろし2023
法林浩之
76 views
•
58 slides
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
NTT DATA Technology & Innovation
157 views
•
63 slides
概念モデリングワークショップ 基礎編
Knowledge & Experience
19 views
•
71 slides
Recently uploaded
(8)
概念モデリングワークショップ 設計編
Knowledge & Experience
•
10 views
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化
Knowledge & Experience
•
6 views
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
NTT DATA Technology & Innovation
•
208 views
さくらのひやおろし2023
法林浩之
•
76 views
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
NTT DATA Technology & Innovation
•
157 views
概念モデリングワークショップ 基礎編
Knowledge & Experience
•
19 views
01Booster Studio ご紹介資料
ssusere7a2172
•
209 views
JJUG CCC.pptx
Kanta Sasaki
•
6 views
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
Editor's Notes
\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