簡體   English   中英

iOS 5+中的Objective-C單例模式

[英]Objective-C singleton pattern in iOS 5+

我一直在閱讀很多關於如何在objective-c中實現單例的線程和博客文章,其中一些可能有點被棄用(2010年或更早),似乎人們對此問題有不同的看法。 .. Apple是否有關於實施單例的文檔? 我找不到它。 如果是這樣,有人可以告訴我在哪里?

我需要一個包含公共和私有變量的類的單例。 目前,這是我對此類的實現:

@interface MySingleton ()
   @property (strong, nonatomic) NSString *state;
@end

@implementation MySingleton

@synthesize state = _state;
@synthesize count = _count;

static MySingleton *sharedObject = nil;

+ (MySingleton *)sharedInstance
{
   static dispatch_once_t _singletonPredicate;

   dispatch_once(&_singletonPredicate, ^{
      sharedObject = [[super allocWithZone:nil] init];
   });

   return sharedObject;
}

+ (id)allocWithZone:(NSZone *)zone 
{
   return [self sharedInstance];
}

這應該是推薦的方式嗎? 我應該如何初始化實例變量public和private?

我想說明單例的另一個問題是:這會產生內存泄漏嗎? 在iOS中實際推薦使用單身人士嗎?

謝謝

以上是正確的,以及@miho關於包含sharedInstance方法內部靜態對象的注釋。 但是沒有理由重寫+allocWithZone: . ObjC中的單身人士通常是“共享的”,而不是強迫的。 您可以自由創建“單身”的其他實例。 如果創建其他實例是非法的,那么你應該讓init執行NSAssert而不是在+allocWithZone:欺騙調用者+allocWithZone: 如果你的單例是可變的(大多數是),你絕對不應該覆蓋+allocWithZone:這樣。

我想說明單例的另一個問題是:這會產生內存泄漏嗎?

不會。此對象永遠不會發布,但始終可以訪問。 那不是泄密。

在iOS中實際推薦使用單身人士嗎?

是的,這是一個非常常見的模式,在Cocoa框架中使用。 也就是說,最近開始有各種其他模式在開發人員中開始流行。 依賴注入引起了一些興趣,雖然我不經常在實踐中看到它。 減少對單例的依賴可以提高可測試性,最近我一直在嘗試如何在代碼中消除其中的一些並取得一些成功。 但他們在可可有着悠久而自豪的歷史,我不認為這是一個問題。

編輯:你的代碼中有一個實際的錯誤。 你應該調用[[self alloc] init] ,而不是[[super alloc] init] 沒有理由調用+allocWithZone:只需使用+alloc (時間...WithZone:方法很有用已經過去了。)

在Xcode中,在“搜索文檔”下,輸入“ 創建單例實例” 有很多結果(但上面的鏈接,在頁面底部,有示例代碼)。

是的,這是推薦的方式。 我如何使用它只有一個小的區別:我在+ (MySingleton *)sharedInstance方法中將sharedObject定義為靜態變量,因為它不可能從其他任何地方然后從getter方法訪問變量。

不,你不會造成內存泄漏。 當您的應用程序終止時,您的應用程序使用的所有保留內存都將被釋放,並且沒有其他情況會釋放靜態共享實例。 在ARC之前的區域,甚至通常會覆蓋release方法,以防止意外釋放物體。

使用gcd對單身人士的一點警告:

dispatch_once(&_singletonPredicate, ^{
      sharedObject = [[super allocWithZone:nil] init];
   });

如果init方法由於某種原因直接或間接地處理單例對象,則會出現死鎖。 出於這個原因,我認為寫一個單例的更合適的方法是通過

+ (void) initialize

方法

我仍在使用來自CocoaWithLove的單身標題 - 可能有點過時但仍然像魅力一樣。 它基本上與此處描述的蘋果文檔相同,我認為至少Apple的文檔( 本頁底部 )仍然有效。 有人假設它將無限期保持有效,因為它是Apple建議的官方解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM