[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アプリ おんぷちゃんアップデート 2010年7月 第1回

先月、iPhoneアプリおんぷちゃん(無料版)を1.3にアップデートして、いくつか機能を追加しました

記事を読む

no image

[iPhone5] ステータスバーの謎の○(丸)表示

iPhone5使い始めて2日目、自宅でもLTE表示が出ていたのになぜかある時から○表示になってしまっ

記事を読む

no image

iPhoneゲーム開発ワークショップ 翔泳社 PJ Cabrera

以前紹介した、iPhone Games Projects の翻訳本「iPhoneゲーム開発ワークショ

記事を読む

ケンジントン スマホ車載マウント

気に入っているのだが2年以上経って経年変化のためかくっつかなくなってしまったので買い直した。 Ama

記事を読む

QUICCO Sound mi.1rev.3

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

記事を読む

[iOS SDK] 消音モードでも音を再生する対応を入れました

昔、 iPhone/iPad はサイレントモードにしても音が鳴る という記事を書いたけれども

記事を読む

no image

[iPhone 開発本] iPhoneのオモチャ箱 でしばらく遊べそう

cocos2d/Box2Dを調べたいと思っていたら丁度発売されたので買ってみた。 実際にcocos2

記事を読む

no image

はじめてのiPhoneプログラミング

さらにiPhoneプログラミング本が出るらしい。出版ラッシュですな。 これは568ページもあるらしい

記事を読む

[iOS SDK] iPad 専用アプリをiPhoneでも使えるようにする

 iPad 初代やiPad2の頃は、iPhoneとiPadの画面サイズがかなり異なり、また

記事を読む

no image

[iPhone SDK] iPhone SDK 開発のレシピ

ずいぶん昔に買ったけれどもブログに書くのを忘れていた。 出版社(秀和システム)の紹介ページ

記事を読む

Message

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

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

Wi-Fi6Eルータ TP-Link AXE5400購入

Wi-Fi6E を試してみたくなり、TP-Link AXE5

児童手当 認定請求書申請 2024 「請求者が養育をする18歳に達する日以降の最初の3月31日までの子の数」とは?

2024年に受給していない人には手紙が届くらしい。 電子申請も

Vision Proアプリ開発本 8/24、8/26に発売

Vision Proアプリ開発入門 P400が 8/24 に発売、V

Developer Strap が日本でも購入可能に

USアカウントでしか購入できなかった Vision Pro 用 De

Vision Pro カバーケースを買ってみた

[itemlink post_id="11629"]

→もっと見る

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