[iPhone SDK] iPhone SDK で Singleton

公開日: : 最終更新日:2011/11/18 iPhone

自分でもよく忘れるので、備忘録的に書いてみる。

iPhone SDKで開発をしていて、時々シングルトンオブジェクトが欲しくなる。
その場合には、Derek Neely で紹介されているとおり、2つのやり方があると思われる。

  1. AppDelegateに変数を持たせて、使う側は [UIApplication sharedApplication] でアクセスする
  2. シングルトンクラスを作る

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)
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
売り上げランキング : 28518

Amazonで詳しく見る by G-Tools

詳解 Objective-C 2.0 改訂版
詳解 Objective-C 2.0 改訂版 荻原 剛志

ソフトバンククリエイティブ 2010-12-17
売り上げランキング : 2192

Amazonで詳しく見る by G-Tools

関連記事

no image

iPhoneアプリにAboutBoxを実装

iPhoneアプリにAboutBoxを実装するためのメモ。 今回、自分のiPhoneアプリにAbou

記事を読む

no image

iOS7 から導入されるキッズカテゴリーにアプリを載せるための作業をしてみる

News and Announcements for Apple Developers でア

記事を読む

no image

[iOS SDK] モーダル表示したViewController を取得する

UIViewControllerの presentViewController:animated:c

記事を読む

no image

[iOS SDK] NSUserDefaults boolForKey でNOが返ってくるとNOが格納されていたのか値が存在しなかったのかが不明

NSUserDefaults Class Reference にあるとおり、NSUserDefau

記事を読む

ドラムちゃんに電子ドラムiWordを接続する

ドラム譜学習アプリ「ドラムちゃん」に、安価なMIDI電子ドラム iWord を接続する方法を説明し

記事を読む

QUICCO Sound mi.1rev.3

Bluetooth でMIDI信号を飛ばせる QUICCO sound mi.1 について。以前 K

記事を読む

no image

Begininng iPhone 3 Development 入手

はじめてのiPhoneプログラミングの原書 Beginning iPhone Development

記事を読む

no image

RPG風タスク管理アプリ EpicWin

Designed for Use を読んでいて、例として紹介されていたので試しに買ってみた RP

記事を読む

iPad, iPhone, Mac, PC で使える Line6 Mobile Keys

今年のCESで発表されて以来ずっと待っていたLine6のMobile Keysがついに発売される。こ

記事を読む

no image

View-Based Application に UINavigationController を追加する方法その2

今回はSkitchを使ってキャプチャ画像を貼ってみた。キャプチャだとコードがコピペできないが...

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

[Xcode] Interface Builder でControl+ドラッグでOutletが作成できない

たまにInterface Builder でUI作っているとはまるの

Ember Mug用のふたを買ってみた

Ember Mug Lid 2022年あけましておめでとうござ

Google Search Console の利用を開始してみた

YouTube DATA API (iOS Quickstart  

Xcode 13.1 アップデート

Apple、統合開発環境「Xcode 13.1」をリリース:Code

watchOS8 アップデート内容

この前購入した Apple Watch SE は watchOS 7

→もっと見る

  • 2009年12月
     123456
    78910111213
    14151617181920
    21222324252627
    28293031  
PAGE TOP ↑