Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
NSHashTableで
Delegatesパターン
自己紹介
@starfruits_j (Little Gleam)
株式会社 Azione
株式会社Azione のiOSアプリ開発、管理職
昨年末にSQLを書くことが嫌いということでNyaruDBと
Realmについて発表しました
PHPではlaravelがお気に入り
開発実績デコメーラー
Nator
モバスペブック
© 2014 Azione Co.,Ltd. All Right Reserved.
個人でもアプリ出してますQRコードリーダー
FF10 モンスター捕獲数カウンター
hackadl
WebPage翻訳for Safari
発表内容Swift!?
NSHashTable
使い道について
Objective-Cが好きnilをスキップできるところ
weak参照(ARC)があるところ
メソッド名が長いところ
NSHashTableという存在
使い方NSHashTable * hashTable = [[NSHashTable alloc] init];
[hashTable addObject:@"test"];
[hashTable addObject:@"obj"];
[has...
options
enum {
// default is strong
NSPointerFunctionsStrongMemory NS_ENUM_AVAILABLE(10_5, 6_0) = (0UL << 0),
NSPointerFun...
速度比較10,000個のUUIDをaddObject
class time
NSArray 0.055016
NSSet 0.023589
NSHashTable 0.022918
速度比較ArrayにcontainsObject:を追加
class time
NSArray 3.670467
NSSet 0.021289
NSHashTable 0.021819
真意はNSPointerFunctionsWeakMemo
ry
[NSHashTable hashTableWithOptions:NSPointerFunctionsWeakMemory];
[NSHashTable weakObjects...
Objectが破棄されると自動で削除NSInteger max = 1000;
@autoreleasepool {
for (NSInteger i = 0; i < max; i++) {
NSString *str = [NSUUID U...
何に使おかUIScrollView.delegate
UIWebView.delegate
大人気!でもdelegateは1対1
1対多のパターンが欲しい
NJKScrollProxyパターン?
_scrollProxy = [[NJKScrollFullScreen alloc] initWithForwardTarget:self]; // UIScrollViewDelegate and
s...
1対多と言えばKVO
contentOffsetをKVOで監視したり
ドラッグのスピード等は独自実装しなければならない
KVOはおそらくassignで保持してるので、removeObserver:
忘れるとクラッシュする
そこでDelegatesパターン- (void)addDelegate:(id <NantokaDelegate>)delegate;
- (void)removeDelegate:(id <NantokaDelegate>)delegate;...
addDelegate - NSArray
- (void)addDelegate:(id <NantokaDelegate>)delegate {
if ([self.delegates containsObject:delegate]) {...
addDelegate - NSHashTable
- (void)addDelegate:(id <NantokaDelegate>)delegate {
[self.delegates addObject:delegate];
}
スッキリ!
登録されたdelegatesに通知- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
for (id <UIScrollViewDelegate> delegate in self....
DegatesパターンにNSHashTableを使うと幸せになる理由delegatesをNSArrayで管理するとretainされる
delegateは基本的にasign < weak参照が良い
deallocでdelegate = nilする...
NSHashTableならweakで管理できるので解放いらない
delegatesパターンってあるの?
聞いたことないです
議論はちらほらあって、権限を移譲できる人が沢山いるの
は良くないとか
実はAppleが採用してたりとか?
とりあえずプロジェクト内を
検索してみた
あった!
AFURLSessionManager
- (void)addDelegateForDownloadTask:(NSURLSessionDownloadTask *)downloadTask
progress:(NSProgress ...
weak参照の通知と言えば
Realmの更新通知_token = [[RLMRealm defaultRealm] addNotificationBlock:^(NSString *notification, RLMRealm *realm)
...
あった!
NSHashTable *_notificationHandlers
こんなケースにも使えそうMemoryManager的な
+ (instansetype)sharedManager;
- (void)addViewController:(UIViewController *)vc;
- (NSArray *)...
NSHashTableでDelegates まとめユニークなコレクションを作る場合、速度はNSArrayより
高速、NSSetと同じ
NSHashTableを利用したdelegatesパターンならKVOの
removeObserver忘れのよう...
Which
http://which.photos
Whichというアプリをリリースします
larabel, RealmでSQL書かずに実装しました
もちろんdelegatesパターン使いました
Upcoming SlideShare
Loading in …5
×
Upcoming SlideShare
Objective-Cのいろいろな反復処理
Next
Download to read offline and view in fullscreen.

Share

NSHashTableでDelegatesパターン

Download to read offline

NSHashTableの使い道について考えました。

Related Books

Free with a 30 day trial from Scribd

See all

NSHashTableでDelegatesパターン

  1. 1. NSHashTableで Delegatesパターン
  2. 2. 自己紹介 @starfruits_j (Little Gleam)
  3. 3. 株式会社 Azione 株式会社Azione のiOSアプリ開発、管理職 昨年末にSQLを書くことが嫌いということでNyaruDBと Realmについて発表しました PHPではlaravelがお気に入り
  4. 4. 開発実績デコメーラー Nator モバスペブック © 2014 Azione Co.,Ltd. All Right Reserved.
  5. 5. 個人でもアプリ出してますQRコードリーダー FF10 モンスター捕獲数カウンター hackadl WebPage翻訳for Safari
  6. 6. 発表内容Swift!? NSHashTable 使い道について
  7. 7. Objective-Cが好きnilをスキップできるところ weak参照(ARC)があるところ メソッド名が長いところ
  8. 8. NSHashTableという存在
  9. 9. 使い方NSHashTable * hashTable = [[NSHashTable alloc] init]; [hashTable addObject:@"test"]; [hashTable addObject:@"obj"]; [hashTable removeObject:@"obj"]; NSLog(@"table: %@", [hashTable allObjects]); NSArrayというよりNSSetを拡張したような感じ ユニークなコレクション
  10. 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. 11. 速度比較10,000個のUUIDをaddObject class time NSArray 0.055016 NSSet 0.023589 NSHashTable 0.022918
  12. 12. 速度比較ArrayにcontainsObject:を追加 class time NSArray 3.670467 NSSet 0.021289 NSHashTable 0.021819
  13. 13. 真意はNSPointerFunctionsWeakMemo ry [NSHashTable hashTableWithOptions:NSPointerFunctionsWeakMemory]; [NSHashTable weakObjectsHashTable];
  14. 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. 15. 何に使おかUIScrollView.delegate UIWebView.delegate 大人気!でもdelegateは1対1 1対多のパターンが欲しい
  16. 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. 17. 1対多と言えばKVO contentOffsetをKVOで監視したり ドラッグのスピード等は独自実装しなければならない KVOはおそらくassignで保持してるので、removeObserver: 忘れるとクラッシュする
  18. 18. そこでDelegatesパターン- (void)addDelegate:(id <NantokaDelegate>)delegate; - (void)removeDelegate:(id <NantokaDelegate>)delegate; - (void)removeAllDelegates;
  19. 19. addDelegate - NSArray - (void)addDelegate:(id <NantokaDelegate>)delegate { if ([self.delegates containsObject:delegate]) { return; } [self.delegates addObject:delegate]; } 同じ通知を複数回投げる必要はないのでcontainsObjectす る
  20. 20. addDelegate - NSHashTable - (void)addDelegate:(id <NantokaDelegate>)delegate { [self.delegates addObject:delegate]; } スッキリ!
  21. 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. 22. DegatesパターンにNSHashTableを使うと幸せになる理由delegatesをNSArrayで管理するとretainされる delegateは基本的にasign < weak参照が良い deallocでdelegate = nilする場合等、循環参照の問題 assignの時は非同期通信等、通信完了前にdelegateが破棄 された場合にクラッシュ dealloc等でdelegate = nil する必要があった weakなら何も起こらず安心
  23. 23. NSHashTableならweakで管理できるので解放いらない
  24. 24. delegatesパターンってあるの? 聞いたことないです 議論はちらほらあって、権限を移譲できる人が沢山いるの は良くないとか 実はAppleが採用してたりとか?
  25. 25. とりあえずプロジェクト内を 検索してみた
  26. 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. 27. weak参照の通知と言えば Realmの更新通知_token = [[RLMRealm defaultRealm] addNotificationBlock:^(NSString *notification, RLMRealm *realm) }]; _tokenを解放すると監視外れるので、weak参照でblockを保 持 delegatesではないけど、blockを何かにaddして保持してい る
  28. 28. あった! NSHashTable *_notificationHandlers
  29. 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. 30. NSHashTableでDelegates まとめユニークなコレクションを作る場合、速度はNSArrayより 高速、NSSetと同じ NSHashTableを利用したdelegatesパターンならKVOの removeObserver忘れのようなことも気にしないでよい NSHashTableの使いどころ KVO以外の方法で1対多の通知を実現したい場合 非同期処理のOperation管理 リークチェック等にも使えそう
  31. 31. Which http://which.photos Whichというアプリをリリースします larabel, RealmでSQL書かずに実装しました もちろんdelegatesパターン使いました
  • t26v0748

    May. 15, 2015
  • takumaarimura1

    Apr. 17, 2015

NSHashTableの使い道について考えました。

Views

Total views

1,523

On Slideshare

0

From embeds

0

Number of embeds

301

Actions

Downloads

3

Shares

0

Comments

0

Likes

2

×