2014-01-05 12 views
0

我正在使用鍵控歸檔,並發現需要一些具有通用標識符的對象。我正在考慮爲此目的引入UDID。iOS如何引入一個類沒有任何子類化的UDID的能力?

我可以創建一個類似這樣的自定義類,讓我的對象繼承自此,但這意味着多個udid實現。我想只有一個。

@interface NSObjectWithUDID : NSObject 

@property(nonatomic,strong,readonly)NSString* udid; 

@end 

我的問題是:如何添加我的班,而不必繼承NSObjectWithUDID爲[UDID]消息作出響應的能力?

我試過類別,但不確定我是否可以在那裏使用一個屬性。

+0

我想你的意思是GUID,而不是UDID。 – neilco

+0

或UUID(GUID實際上是UUID的Microsoft實現) – marko

回答

4

你是對的,你不能在一個類別添加屬性,但你可以做使用objc運行時方法

#import <objc/runtime.h> 
static char udidKey; 

@implementation NSObject (UDIDAddition) 

- (NSString *)udid { 
    return objc_getAssociatedObject(self, &udidKey); 
} 

- (void)setUdid:(NSString *)udid { 
    objc_setAssociatedObject(self, &udidKey, udid, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

@end 
+2

您可以將屬性添加到類別,它們只是不能具有支持變量。如果以某種方式計算UDID,則將屬性添加到類別接口是可以的。你只需要自己實現getter(和setter,如果不是隻讀),就像你的例子。 –

+1

確實如此,但對於大多數udid生成方法來說,存儲/檢索可能會快得多 – coneybeare

+0

是的,這是一個很好的觀點! –

2

爲什麼你認爲這意味着udid多個實現運行時設定的?

如果你有類ABC等從NSObject繼承和您切換他們都來自NSObjectWithUDID繼承,而不是再有就是隻是一個udid執行 - 它是由編譯器實現你。

你是對的,使用類別添加屬性並不重要 - 但可以使用關聯對象來完成。然而,這裏似乎沒有必要走這條路。

HTH

+0

這個工作,除非你想有UUID的一些類是系統定義的類。 –

+0

我將繼承的一些類來自SpriteKit框架,並且我只能從它們繼承,如SKSpriteNode。你的解決方案就是我現在所擁有的,我只是在想可能會有更好的東西。 –

+0

@AlexStone - 如果是這種情況,那麼去相關的對象 - 它們提供你需要的「支持變量」,只是在getter中做你平常的懶惰實例化。 – CRD

相關問題