2010-08-13 43 views
0

什麼是這個相當於目標C:一些能幫我轉換C++代碼到目標C

template<class T> 
class Singleton 
{ 
public: 
    static T * instance() 
    { 
     static T t; 
     return &t; 
    } 
private: 
    Singleton(); 
    ~Singleton(); 
}; 

在呼籲:

friend class Singletone<MyManagerClass>;

+0

可能重複[什麼是您的Objective-C的單身樣子的?](http://stackoverflow.com/questions/145154/what-does-your-objective-c-singleton-look-like) – 2010-08-13 05:45:23

+0

請參閱此代碼使用模板 iPhoneDev 2010-08-13 07:29:12

回答

0
#define SINGLETON_FOR_CLASS(classname)       \ 
                   \ 
static classname *shared##classname = nil;      \ 
                   \ 
+ (classname *)instance {          \ 
    @synchronized(self) {          \ 
     if (shared##classname == nil) {       \ 
      [[self alloc] init];        \ 
     }              \ 
    }               \ 
                   \ 
    return shared##classname;         \ 
}                \ 
                   \ 
+ (id)allocWithZone:(NSZone *)zone {       \ 
                   \ 
    @synchronized(self) {          \ 
     if (shared##classname == nil) {       \ 
      shared##classname = [super allocWithZone:zone];  \ 
      return shared##classname;       \ 
     }              \ 
    }               \ 
                   \ 
    return nil;             \ 
}                \ 
                   \ 
- (id)copyWithZone:(NSZone *)zone {        \ 
                   \ 
    return self;            \ 
}                \ 
                   \ 
- (id)retain {             \ 
                   \ 
    return self;            \ 
}                \ 
                   \ 
- (NSUInteger)retainCount {          \ 
                   \ 
    return UINT_MAX;           \ 
}                \ 
                   \ 
- (void)release {            \ 
                   \ 
}                \ 
                   \ 
- (id)autorelease {            \ 
                   \ 
    return self;            \ 
}                \ 
0

哦,那很容易!

@interface YourClass : NSObject {} 
+ (YourClass *)singleton; 
@end 

static YourClass *singletonVar = nil; 
@implementation YourClass 
+ (YourClass *)singleton 
{ 
    if(! singletonVar) { 
    singletonVar = [[self alloc] init]; 
    } 
    return singletonVar; 
} 
@end 

現在,您可以隨時致電[[YourClass singleton] doSomething]! :D 就像你做的[[NSUserDefaults standUserDefaults] valueForKey:@「Burp」]等等, 注意到這個廣告開銷給你的應用程序,所以當你在一個範圍內多次使用單例時,考慮將它存儲在性能指針。

+0

以上C++代碼通常用於爲任何類創建Singleton對象。這不是你的情況。我正在尋找可以返回給定類的單例對象的Objective c類。謝謝 – iPhoneDev 2010-08-13 07:20:56

+0

這不是線程安全的,但它會正常工作,否則。 – dreamlax 2010-08-13 07:52:33

2

Objective-C不提供模板,當編譯爲Objective-C++時,模板不能與Objective-C類一起使用。兩種編程語言之間並不總是可以進行1對1的轉換。例如,Objective-C根本不提供編譯時強制的私有方法,因此無法實現你想要的。

Objective-C具有C++中沒有的功能,例如@encode()指令。

也許與此主題有關:重要的是要明白,與C++配合使用的設計模式不一定能很好地工作於—或者完全可以使用Objective-C工作—。

您的設計能夠單類任何課程的目標是什麼?也許有更成熟的Objective-C方法來實現你想要的。也可能有一種方法可以使用預處理器宏來實現類似的功能,但不想沿着這條路徑前進。的

+0

謝謝,那麼我應該在目標c中寫出什麼來實現這個目標..請探索一下 – iPhoneDev 2010-08-13 09:40:05

+0

我有辦法在目標c中創建一個通用的單例程,這樣的一些東西..的#define SINGLETON_FOR_CLASS(類名)\t \t \t \t \t \t \t \ \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \ 靜態類名*共享##類名=無; – iPhoneDev 2011-01-04 19:17:48

+0

@iPhoneDev:你的最終目標是什麼?你計劃擁有多少個單身人士?他們不能簡單地成爲你的應用程序委託的屬性嗎? – dreamlax 2011-01-04 19:54:58