[iPhone SDK] iPhone SDK で Singleton
自分でもよく忘れるので、備忘録的に書いてみる。
iPhone SDKで開発をしていて、時々シングルトンオブジェクトが欲しくなる。
その場合には、Derek Neely で紹介されているとおり、2つのやり方があると思われる。
- AppDelegateに変数を持たせて、使う側は [UIApplication sharedApplication] でアクセスする
- シングルトンクラスを作る
1. のAppDelegate 方式は本などでもよく使われていると思う。実際、UIApplication の sharedApplication はシングルトンオブジェクトを取得するものだと思うのでやり方としては間違っていないとは思う。(上記の Derek Neely ではこの方式はおすすめされていないが)
シングルトンクラスを作る場合、マイコミジャーナルのダイナミックObjective-C が参考になる。
他にも自分がシングルトンクラスを作ったときに参考にしたページがあったと思ったが忘れてしまった… 思い出したら追記しよう。
2010/09/21 追記:
結局ページは見つからなかったが、Erica Sadun の The iPhone Developer’s Cookbook 2nd EditionのP119 “Crafting Singletons”にのっていた。
Objective-C でシングルトンパターン | Sun Limited Mt.にも載っていた。
@implementation History static History* sharedHistory = nil; + (History*)sharedInstance { if (!sharedHistory) { sharedHistory = [[self alloc] init]; } } return sharedHistory; } + (id)allocWithZone:(NSZone *)zone { @synchronized(self) { if (sharedHistory == nil) { sharedHistory = [super allocWithZone:zone]; return sharedHistory; } } return nil; }
追記 2011/09/05
よく見ると、上記全てが参照しているのはAppleのページらしい。
Cocoa Fundamentals Guide: シングルトンインスタンスの作成
追記 2011/10/16
上記のCocoa Fundamentals Guide: シングルトンインスタンスの作成で、下記がなぜ [[self alloc]init] で良いのか理解できていなかったが、Singleton ADC example – dealloc and assignment | Cocoabuilder を読んで思い出した。
+ (MyGizmoClass*)sharedManager { @synchronized(self) { if (sharedGizmoManager == nil) { [[self alloc] init]; // ここでは代入していない ← init しているのにどこにも代入してない? } } return sharedGizmoManager; } + (id)allocWithZone:(NSZone *)zone { { @synchronized(self) { if (sharedGizmoManager == nil) { sharedGizmoManager = [super allocWithZone:zone]; return sharedGizmoManager; // 最初の割り当てで代入し、返す } } return nil; // 以降の割り当てではnilを返すようにする }
alloc は +(id)allocWithZone:(NSZone*)zone の 引数 nil 版なので alloc を呼ぶと allocWithZone:nil が呼ばれるので、[[self alloc]init] するだけで良いのだった。
このあたりは、詳解 Objective-C 2.0 改訂版 でくわしく説明されている。
ただ、このコードは正直ちょっとやり過ぎな気もしていて、自分だけで使うSingletonのコードであればここまでやらなくても良いと思われる。
iphone – Apple Singleton example query? – Stack Overflow
あたりでもそう書かれていた。
また、初期化コードはふつうにinitの中に書くのでよいとのこと。
iphone – Cocoa – Singleton object: Where to initialize member variables? – Stack Overflow
マクロでSingleton を実現する例。AppDelegate 方式は悪だとも書いてあった。
Cocoa with Love: Singletons, AppDelegates and top-level data.
The iPhone Developer’s Cookbook: Building Applications with the iPhone 3.0 SDK (2nd Edition) (Developer’s Library) | |
![]() |
Erica Sadun
Addison-Wesley Professional 2009-12-28 |
詳解 Objective-C 2.0 改訂版 | |
![]() |
荻原 剛志
ソフトバンククリエイティブ 2010-12-17 |
関連記事
-
-
Apple Watch用バッテリーロガーを公開しました
1年前に開発し、App StoreにSubmitしたものの Rejectされ続けていたアプリをその
-
-
[iOS SDK] アプリを起動しない 3D quick action は実現できるか
iPhone 6s / iPhone 6s Plus から 3D Touch 機能が搭載されたが、搭
-
-
英単語学習アプリ EverLearn 1.4.0 を公開しました
ようやく、iOS7 に対応した EverLearn 1.4.0 を公開しました。 i
-
-
おすすめ iPhone5用ケース iJacket
iPhone5購入時に同時に購入したケース(写真上)が1ヶ月程度でかなりみすぼらしい状態
-
-
[iPhone6plus] 買うかかなり悩み中
9/19 に発売されてからiPhone6Plusを買おうか、買うならいつ買おうか、キャリアは
-
-
iPhone6, Xperia, Galaxy Note サイズ比較
iPhone6 Plus は一体どれくらい大きいのか想像ができなかったの
-
-
[iPhone SDK] Apple Push Notification を利用したアプリをサポートする Easy APNS
以前 apns-php を使ってApple Push Notification を実行する話を書いた
-
-
[iPhone 開発本] iPhoneのオモチャ箱 でしばらく遊べそう
cocos2d/Box2Dを調べたいと思っていたら丁度発売されたので買ってみた。 実際にcocos2
-
-
iOSアプリの Ad Hoc 配布の悪夢から解放される TestFlight
面倒だった Adhoc 版のやりとりを格段に楽にしてくれる TestFlight | つくる社LL
-
-
[iPhone6 Plus] はじめて保護ガラスを貼ってみた JTT Online Glass Protector
会社の知り合いが色をまちがって購入したということで、iPhone6 Plus 用保護ガラスを