SlideShare a Scribd company logo
Submit Search
Upload
Login
Signup
NSHashTableでDelegatesパターン
Report
Masaki Oshikawa
Follow
Software Developer at Azione co., Ltd.
Apr. 11, 2015
•
0 likes
•
1,599 views
1
of
31
NSHashTableでDelegatesパターン
Apr. 11, 2015
•
0 likes
•
1,599 views
Download Now
Download to read offline
Report
Technology
NSHashTableの使い道について考えました。
Masaki Oshikawa
Follow
Software Developer at Azione co., Ltd.
Recommended
20141017 introduce razor
do_aki
1.5K views
•
31 slides
なかったらINSERTしたいし、あるならロック取りたいやん?
ichirin2501
41.5K views
•
19 slides
ウェブから情報をあつめる
Shuhei Iitsuka
10.7K views
•
33 slides
ストリーム処理エンジン「Zero」の開発と運用
Eiichi Sato
5.2K views
•
27 slides
『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
Hiroshi Tokumaru
74.2K views
•
49 slides
Gruntでjava script前作業の自動化!
Tanaka Yuichi
2.2K views
•
37 slides
More Related Content
What's hot
類義語検索と類義語ハイライト
Shinichiro Abe
8K views
•
18 slides
SecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのか
Hiroshi Tokumaru
9.2K views
•
27 slides
MongoDBのはじめての運用テキスト
Akihiro Kuwano
8.3K views
•
43 slides
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
kwatch
34K views
•
58 slides
初心者向けMongoDBのキホン!
Tetsutaro Watanabe
52.3K views
•
21 slides
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
infinite_loop
47.9K views
•
30 slides
What's hot
(20)
類義語検索と類義語ハイライト
Shinichiro Abe
•
8K views
SecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのか
Hiroshi Tokumaru
•
9.2K views
MongoDBのはじめての運用テキスト
Akihiro Kuwano
•
8.3K views
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
kwatch
•
34K views
初心者向けMongoDBのキホン!
Tetsutaro Watanabe
•
52.3K views
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
infinite_loop
•
47.9K views
Fess/Elasticsearchを使った業務で使える?全文検索への道
Shinsuke Sugaya
•
11.8K views
Mroongaを選んだ理由と ちょっと嬉しかった話
Terui Masashi
•
5.5K views
MongoDBが遅いときの切り分け方法
Tetsutaro Watanabe
•
34.4K views
よろしい、ならばMicro-ORMだ
Narami Kiyokura
•
8.5K views
Aerospike v3 install
Makoto Uehara
•
4.6K views
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
Takahiro Inoue
•
43.2K views
LastaFluteでKotlinをはじめよう
Shinsuke Sugaya
•
2.1K views
Introduction to MongoDB
moai kids
•
15.5K views
関数プロキシを使って REST APIっぽくを使ってみる
Noriaki Sakata
•
60 views
安全なPHPアプリケーションの作り方2013
Hiroshi Tokumaru
•
248.2K views
XXE、SSRF、安全でないデシリアライゼーション入門
Hiroshi Tokumaru
•
3.6K views
データ圧縮アルゴリズムを用いたマルウェア感染通信ログの判定
JubatusOfficial
•
12.1K views
Python と Xpath で ウェブからデータをあつめる
Shuhei Iitsuka
•
6.1K views
徳丸本ができるまで
Hiroshi Tokumaru
•
4.8K views
Similar to NSHashTableでDelegatesパターン
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
Hiroh Satoh
49.2K views
•
91 slides
hbstudy#6LTyuzorock
yuzorock
669 views
•
5 slides
オープンソースで作るスマホ文字認識アプリ
陽平 山口
79.4K views
•
44 slides
AWS SDK for Smalltalk
Sho Yoshida
3.5K views
•
47 slides
鹿駆動勉強会 青江発表資料
Takashi Aoe
1.4K views
•
18 slides
Groovyコンファレンス
Shinichiro Takezaki
984 views
•
31 slides
Similar to NSHashTableでDelegatesパターン
(20)
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
Hiroh Satoh
•
49.2K views
hbstudy#6LTyuzorock
yuzorock
•
669 views
オープンソースで作るスマホ文字認識アプリ
陽平 山口
•
79.4K views
AWS SDK for Smalltalk
Sho Yoshida
•
3.5K views
鹿駆動勉強会 青江発表資料
Takashi Aoe
•
1.4K views
Groovyコンファレンス
Shinichiro Takezaki
•
984 views
An Internal of LINQ to Objects
Yoshifumi Kawai
•
40K views
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
emasaka
•
1.3K views
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
Naoya Ito
•
5.5K views
Laravel における Blade 拡張のツラミ
Shohei Okada
•
2.2K views
Web制作勉強会 #2
Moto Yan
•
613 views
ATN No.2 Scala事始め
AdvancedTechNight
•
1.3K views
AzureでLaravel動かしてみた
Keiji Kamebuchi
•
4.9K views
愛せよ、さもなくば捨てよ。
Sho Yoshida
•
1.4K views
楽ちんユーザー認証付Spa
Takahiro Tsuchiya
•
3.9K views
Automation with SoftLayer and Zabbix
softlayerjp
•
1.5K views
SQLアンチパターンNight
Hironori Miura
•
2.6K views
Lithium Labo #1
Yusuke Ando
•
2K views
ServerSideJavaScript
Ryunosuke SATO
•
1.9K views
JSX 速さの秘密 - 高速なJavaScriptを書く方法
Kazuho Oku
•
29.1K views
Recently uploaded
インフラチームとCCoEの関係.pptx
ssuser5c7ee4
72 views
•
18 slides
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...
NTT DATA Technology & Innovation
32 views
•
44 slides
骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)
NTT DATA Technology & Innovation
321 views
•
44 slides
画像生成AIの問題点
iPride Co., Ltd.
127 views
•
9 slides
NoSQL/SQLデュアルインターフェースを備えた IoT向けデータベースGridDB - 強化された時系列データ管理・検索機能について -
griddb
6 views
•
46 slides
MLOps Course Slides_JP(配布用).pdf
Yuya Yamamoto
245 views
•
31 slides
Recently uploaded
(11)
インフラチームとCCoEの関係.pptx
ssuser5c7ee4
•
72 views
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...
NTT DATA Technology & Innovation
•
32 views
骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)
NTT DATA Technology & Innovation
•
321 views
画像生成AIの問題点
iPride Co., Ltd.
•
127 views
NoSQL/SQLデュアルインターフェースを備えた IoT向けデータベースGridDB - 強化された時系列データ管理・検索機能について -
griddb
•
6 views
MLOps Course Slides_JP(配布用).pdf
Yuya Yamamoto
•
245 views
磁石内臓イヤリングによる磁力変化を利用したジェスチャ識別
sugiuralab
•
90 views
拡散する画像生成.pdf
NTTDOCOMO-ServiceInnovation
•
226 views
指側面を入力インタフェース化するリング型デバイス
sugiuralab
•
5 views
ヒアラブルデバイスにおける音漏れ信号を用いた空中ジェスチャ認識
sugiuralab
•
83 views
遠征ドルヲタのための便利サイトを作ってみた
Kenta Fujimoto
•
91 views
NSHashTableでDelegatesパターン
1.
NSHashTableで Delegatesパターン
2.
自己紹介 @starfruits_j (Little Gleam)
3.
株式会社 Azione 株式会社Azione のiOSアプリ開発、管理職 昨年末にSQLを書くことが嫌いということでNyaruDBと Realmについて発表しました PHPではlaravelがお気に入り
4.
開発実績デコメーラー Nator モバスペブック © 2014 Azione
Co.,Ltd. All Right Reserved.
5.
個人でもアプリ出してますQRコードリーダー FF10 モンスター捕獲数カウンター hackadl WebPage翻訳for Safari
6.
発表内容Swift!? NSHashTable 使い道について
7.
Objective-Cが好きnilをスキップできるところ weak参照(ARC)があるところ メソッド名が長いところ
8.
NSHashTableという存在
9.
使い方NSHashTable * hashTable
= [[NSHashTable alloc] init]; [hashTable addObject:@"test"]; [hashTable addObject:@"obj"]; [hashTable removeObject:@"obj"]; NSLog(@"table: %@", [hashTable allObjects]); NSArrayというよりNSSetを拡張したような感じ ユニークなコレクション
10.
options enum { // default
is strong NSPointerFunctionsStrongMemory NS_ENUM_AVAILABLE(10_5, 6_0) = (0UL << 0), NSPointerFunctionsOpaqueMemory NS_ENUM_AVAILABLE(10_5, 6_0) = (2UL << 0), NSPointerFunctionsMallocMemory NS_ENUM_AVAILABLE(10_5, 6_0) = (3UL << 0), NSPointerFunctionsMachVirtualMemory NS_ENUM_AVAILABLE(10_5, 6_0) = (4UL << 0), NSPointerFunctionsWeakMemory NS_ENUM_AVAILABLE(10_8, 6_0) = (5UL << 0), NSPointerFunctionsObjectPersonality NS_ENUM_AVAILABLE(10_5, 6_0) = (0UL << 8), NSPointerFunctionsOpaquePersonality NS_ENUM_AVAILABLE(10_5, 6_0) = (1UL << 8), NSPointerFunctionsObjectPointerPersonality NS_ENUM_AVAILABLE(10_5, 6_0) = (2UL << 8), NSPointerFunctionsCStringPersonality NS_ENUM_AVAILABLE(10_5, 6_0) = (3UL << 8), NSPointerFunctionsStructPersonality NS_ENUM_AVAILABLE(10_5, 6_0) = (4UL << 8), NSPointerFunctionsIntegerPersonality NS_ENUM_AVAILABLE(10_5, 6_0) = (5UL << 8), NSPointerFunctionsCopyIn NS_ENUM_AVAILABLE(10_5, 6_0) = (1UL << 16), }; defaultではhashとisEqual:を使って比較
11.
速度比較10,000個のUUIDをaddObject class time NSArray 0.055016 NSSet
0.023589 NSHashTable 0.022918
12.
速度比較ArrayにcontainsObject:を追加 class time NSArray 3.670467 NSSet
0.021289 NSHashTable 0.021819
13.
真意はNSPointerFunctionsWeakMemo ry [NSHashTable hashTableWithOptions:NSPointerFunctionsWeakMemory]; [NSHashTable weakObjectsHashTable];
14.
Objectが破棄されると自動で削除NSInteger max =
1000; @autoreleasepool { for (NSInteger i = 0; i < max; i++) { NSString *str = [NSUUID UUID].UUIDString; [ht addObject:str]; NSLog(@"count %ld", ht.allObjects.count); } } NSLog(@"count %ld %@", ht.allObjects.count, ht.allObjects); countは反映されないので、allObjects.countが良いかと
15.
何に使おかUIScrollView.delegate UIWebView.delegate 大人気!でもdelegateは1対1 1対多のパターンが欲しい
16.
NJKScrollProxyパターン? _scrollProxy = [[NJKScrollFullScreen
alloc] initWithForwardTarget:self]; // UIScrollViewDelegate and self.tableView.delegate = (id)_scrollProxy; // cast for surpress incompatible warnings _scrollProxy.delegate = self; delegateは1対1の通知パターンなので仕方ない
17.
1対多と言えばKVO contentOffsetをKVOで監視したり ドラッグのスピード等は独自実装しなければならない KVOはおそらくassignで保持してるので、removeObserver: 忘れるとクラッシュする
18.
そこでDelegatesパターン- (void)addDelegate:(id <NantokaDelegate>)delegate; -
(void)removeDelegate:(id <NantokaDelegate>)delegate; - (void)removeAllDelegates;
19.
addDelegate - NSArray - (void)addDelegate:(id <NantokaDelegate>)delegate
{ if ([self.delegates containsObject:delegate]) { return; } [self.delegates addObject:delegate]; } 同じ通知を複数回投げる必要はないのでcontainsObjectす る
20.
addDelegate - NSHashTable - (void)addDelegate:(id <NantokaDelegate>)delegate
{ [self.delegates addObject:delegate]; } スッキリ!
21.
登録されたdelegatesに通知- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{ for (id <UIScrollViewDelegate> delegate in self.delegates) { if ([delegate conformsToProtocol:@protocol(UIScrollViewDelegate)]) { if ([delegate respondsToSelector:@selector(scrollViewDidScroll:)]) { [delegate scrollViewDidScroll:scrollView]; } } } }
22.
DegatesパターンにNSHashTableを使うと幸せになる理由delegatesをNSArrayで管理するとretainされる delegateは基本的にasign < weak参照が良い deallocでdelegate
= nilする場合等、循環参照の問題 assignの時は非同期通信等、通信完了前にdelegateが破棄 された場合にクラッシュ dealloc等でdelegate = nil する必要があった weakなら何も起こらず安心
23.
NSHashTableならweakで管理できるので解放いらない
24.
delegatesパターンってあるの? 聞いたことないです 議論はちらほらあって、権限を移譲できる人が沢山いるの は良くないとか 実はAppleが採用してたりとか?
25.
とりあえずプロジェクト内を 検索してみた
26.
あった! AFURLSessionManager - (void)addDelegateForDownloadTask:(NSURLSessionDownloadTask *)downloadTask progress:(NSProgress
* __autoreleasing *)progress destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHa - (void)removeAllDelegates; delegatesはNSMutableDictionaryでした。
27.
weak参照の通知と言えば Realmの更新通知_token = [[RLMRealm
defaultRealm] addNotificationBlock:^(NSString *notification, RLMRealm *realm) }]; _tokenを解放すると監視外れるので、weak参照でblockを保 持 delegatesではないけど、blockを何かにaddして保持してい る
28.
あった! NSHashTable *_notificationHandlers
29.
こんなケースにも使えそうMemoryManager的な + (instansetype)sharedManager; - (void)addViewController:(UIViewController
*)vc; - (NSArray *)leakedViewControllers; - (NSArray *)leakedViewControllers { NSMutableArray *r = [@[] mutableCopy]; for (UIViewController *vc in self.hashTable.allObjects) { if (??? vc.parentViewController == nil ????) { [r addObject:vc]; } } return r; } Leaks繋がなくてもデバッグできそう!
30.
NSHashTableでDelegates まとめユニークなコレクションを作る場合、速度はNSArrayより 高速、NSSetと同じ NSHashTableを利用したdelegatesパターンならKVOの removeObserver忘れのようなことも気にしないでよい NSHashTableの使いどころ KVO以外の方法で1対多の通知を実現したい場合 非同期処理のOperation管理 リークチェック等にも使えそう
31.
Which http://which.photos Whichというアプリをリリースします larabel, RealmでSQL書かずに実装しました もちろんdelegatesパターン使いました