單例模式:總是返回自己的同一個實例,它提供了對類的對象所提供的資源的全局訪問點,並且返回的實例只能被實例化一次. 單例設計模式設計需要考慮的兩個問題: (1) :發起調用的對象不能以其他分配方式實例化單例對象,否則,就有可能創建單例類的多個實例 (2) :對單例對象實例化的限制應該與引用計數內存模型共存. Singleton.h #import <Foundation/Foundation.h> @interface Singleton : NSObject +(Singleton *) sharedInstance; @end Singleton.m #import "Singleton.h" @implementation Singleton static Singleton *sharedSingleton = nil; +(Singleton *) sharedInstance{ if (sharedSingleton == nil) { //sharedSingleton = [[Singleton alloc] init]; // --------->>>>>(1) //sharedSingleton = [[super allocWithZone:NULL] init]; /* 這裡使用 super而不適用self的原因是self已經重載了allocWithZone方法 所以通過調用父類的方法,實現內存的分配 其實allocWithZone方法內部調用的是NSAllocateObject方法 */ // --------->>>>>(2) sharedSingleton = [NSAllocateObject([self class], 0, NULL) init]; /* 第一個參數是 類的類型 第二個參數是 用於索引的實例變量的額外字節數,總是 0 第三個參數是 用於指定內存中分配的區域,一般為NULL,表示為默認區域 這裡不適用(1)而使用(2)的原因是處理不管是實例化Singleton還是子類,都適用 */ } return sharedSingleton; } /* 調用類的allocWithZone傳入NSZone參數,為即將產生的新對象分配空間 重載的目的是當使用對象的alloc方法時不會產生新的實例 因為 alloc方法其實調用的就是 allocWithZone:NULL方法,防止因 alloc而產生其他的實例 */ +(id) allocWithZone:(struct _NSZone *)zone{ return [[self sharedInstance] retain]; } /* 這裡重載copyWithZone的目的,是防止使用 copy 方法時產生其他的實例 */ -(id) copyWithZone:(NSZone *)zone{ return self; } -(id) retain{ return self; } -(NSUInteger) retainCount{ return NSUIntegerMax; } -(void) release{ //什麼也不做 } -(id) autorelease{ return self; } @end