2012-07-19 37 views
2

我有點新的iOS 5的單身人士和我使用的是單作爲證明這裏:我的單身人士可以改善嗎?

iOS 5 Singletons

事情是這樣的:

MyManager.h

#import <Foundation/Foundation.h> 
@interface MyManager : NSObject 

//Data for section 1 
@property(nonatomic,copy) NSString * section1a; 
@property(nonatomic, assign) NSUInteger section1b; 


//Data for section 2 
@property(nonatomic,copy) NSString * section2a; 
@property(nonatomic, assign) NSUInteger section2b; 

+ (id)sharedInstance; 
@end 

MyManager.m

@implementation MyManager 
@synthesize section1a, section1b, section2a; , section2b; 

+ (id)sharedInstance 
{ 
    static dispatch_once_t pred = 0; 
    __strong static id _sharedObject = nil; 
    dispatch_once(&pred, ^{ 
     _sharedObject = [[self alloc] init]; // or some other init method 
    }); 
    return _sharedObject; 
} 
@end 

所以我用它如下:

MyManager * myManager = [MyManager sharedInstance]; 
myManager.data = self.data 

這是你如何一般使用單身?我錯過了什麼? 對不起,基本問題我只是想確保我做對了。

謝謝

+0

我不確定你在iOS 5或其他版本中的差異。但我認爲你錯過了在.m文件中聲明這一點:static MyManager * _sharedObject = nil; – 2012-07-19 15:45:54

+0

只是爲了你,你可以在你的單例類(除了'+ sharedInstance'方法)'+ allocWithZone:'和'+ copyWithZone:'實現這兩個方法,並且你可以添加一個'MyManager * _sharedObject'成員也適合你的班級。 :) – holex 2012-07-19 15:51:43

回答

1

你做得對。這是(目前:)的方式去,並與ARC啓用,多線程等工作正常。

它不是嚴格單身,因爲你可以分配更多的類實例,但我不認爲這是與你的情況有關。

+0

你能幫我編輯一下我的代碼,這樣它就像一個真正的單身人士? – jini 2012-07-19 16:34:43

+0

我實際上會提出反對,因爲幾乎沒有理由這樣做。你發佈的代碼正常工作。一個「真正的」單身人士將意味着手動記憶管理的擺弄 - 這些我很高興,我現在很少這麼做。 :) – 2012-07-19 16:40:34

+0

感謝您的提示 – jini 2012-07-19 17:23:41

1

這不是一個單身人士,因爲你可以用alloc/init方法創建這個類的多個實例。 正確答案is here

+1

嗯,這是有效的,但一個堅定的人會使用像'class_createInstance'這樣的運行時方法, – 2012-07-19 15:49:53

0

我通常讓我的單身這樣(假設我們正在爲管理一個單):

static (Manager *) instance; 

+ (Manager *) getInstance 
{ 
    if(!instance) instance = [[Manager alloc] init]; 
    return instance; 
} 

這是一個非常基本的單(不考慮多線程或其他高級功能),但這是基本格式。

+1

壞主意,多線程代碼會讓這個失敗比在桌面上拉動插件更快。 – 2012-07-19 15:47:42

+0

我同意多線程代碼會使這個失敗;但是,他從來沒有說他想要一個線程安全的單身人士。我只是向他展示了 – Nosrettap 2012-07-19 15:49:39

+0

的裸骨版本,他的確給了一個警告...... – jini 2012-07-19 15:50:08

0

請參閱:Singleton in iOS 5?您應該重寫allowWithZone以防止惡意代碼創建新實例。