pixyzehn blog

iPhone App, Mac App, Programming, Web service, Tool, Evernote, etc

iOSでシングルトンなインスタンスを生成する

http://www.flickr.com/photos/21651009@N00/13495894103
photo by sachman75


シングルトンのことについてまとめました。

シングルトンとは


あるインスタンスを生成するときにそのインスタンスが1つしか生成されないことを保証することができるデザインパターンをシングルトンといいます。NSFileManagerやNSUserDefaultsのようなものもシングルトンパターンといえるそうです。


Singleton.h

@interface Singleton : NSObject
+ (instancetype)sharedInstance;
@end


Singleton.m

+ (instancetype)sharedController {
    static id instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[self alloc] init];
    });
    return instance;
}


シングルトンの取得

Singleton *Singleton = [Singleton sharedController];


dispatch_onceの引数に渡したブロックはアプリケーションスコープで1度のみ実行されることが保証されます。



シングルトンを使うメリット

・複数のクラス間での変数やオブジェクトの共有が簡単にできる。

・複数のクラス間でメソッドの共有ができる。

・ViewControllerの機能を分担させることができる。


WEB+DB PRESS Vol.79

WEB+DB PRESS Vol.79

  • 作者: 成瀬ゆい,そらは(福森匠大),西磨翁,小川航佑,佐藤新悟,塚越啓介,藤原亮,堀哲也,田村孝文,桑野章弘,松浦隼人,中村俊之,田中哲,福永亘,杉山仁則,伊藤直也,登尾徳誠,近藤宇智朗,若原祥正,松木雅幸,奥野幹也,後藤秀宣,羽二生厚美,笹田耕一,平河正博,東舘智浩,渡邊恵太,中島聡,A-Listers,はまちや2,川添貴生,山田育矢,伊藤友隆,村田賢太,まつもとゆきひろ,佐野岳人,山口恭兵,千葉俊輝,平松亮介,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2014/02/22
  • メディア: 大型本
  • この商品を含むブログ (2件) を見る


こちらの雑誌の質問リストアプリの開発においてyahoo知恵袋のAPIを用いた実装でAPIアクセスを通信用クラスをシングルトンなインスタンスを生成することで実装していました。


以下一部抜粋です。


YCBNetworkController.h

#import <Foundation/Foundation.h>

@interface YCBNetworkController : NSObject

+ (instancetype)sharedController;

- (void)fetchNewQuestionsCompletion:(void (^)(NSArray *questions, NSURLResponse *response, NSError *error))completion;

@end


ちなみにinstancetype型は、レシーバのクラスが返り値オブジェクトのクラスが等しくなることを明示的に示すための、メソッドの返り値にのみ使える型です。

+ (instancetype)sharedController {
    static id instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[self alloc] init];
    });
    return instance;
}


以下がYCBQuestionListViewControllerというViewControllerから先ほどのシングルトンなクラスを用いる例です。

- (void)fetchNewQuestions
{
    [[YCBNetworkController sharedController] fetchNewQuestionsCompletion:
     ^(NSArray *questions, NSURLResponse *response, NSError *error) {
         
         self.questions = questions;
         
         // ビューの更新はメインスレッドで実行
         dispatch_async(dispatch_get_main_queue(), ^{
             [self.tableView reloadData];
         });
         
     }];
}


参考サイト


http://qiita.com/yuky_az/items/27031ec5ca55a95d6209

http://programming-ios.com/objective-c-singleton/

http://objective-audio.jp/2009/09/grand-central-dispatch-block.html