[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

関連記事

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

たまにInterface Builder でUI作っているとはまるのでメモしておく。 Xco

記事を読む

AutoLayout 問題で Xcode6 が起動しなくなった

iPhone6 Plus の巨大な画面に対応するために、はじめて Interface Builder

記事を読む

MacOS版1Password を3.8.22から 5.4.1にアップグレード

3.xからの1Password ユーザで、MacOS版もiOS版も有料版を3.xの頃に購入して、

記事を読む

Reject履歴 EverLearn 1.7.0

どうやら Apple Watch対応アプリの審査は厳しいらしいので、Rejectされた履歴を書いてみ

記事を読む

no image

LogLocations iOS7 不具合調査 (startMonitoringSignificantLocationChanges 挙動変更)

LogLocations のユーザの方から、iOS7 になってからLogLocationsでログが保

記事を読む

dyld`__abort_with_payload:でクラッシュ WatchKitApp on Xcode11.1

Xcode 11.0 や Xcode11.1で以前はビルドして実行できていたWatchKi

記事を読む

EverLearn-Pebble

2016年の総括

2015年の振り返り を振り返ってみて興味深かったので、2016年も書いてみる。個人的には、2016

記事を読む

no image

iPhone向け有償・無償フレームワーク

かごおた さんで、iPhone アプリ開発で使用できる有償・無償フレームワークが紹介されていた。 有

記事を読む

no image

[iPhone SDK] iOS 4で導入された Blocks とは

Game Center を試していると、たくさんの^ (Caret というらしい。自分はハットと覚え

記事を読む

iTunes Connect でアプリページを表示できない

いつからかわからないけれども、iTunes Connect で自分のアプリを表示できなくなってしまい

記事を読む

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 ↑