在Objective-C,如果我需要添加到UIButton的,我可以使用分類爲額外的方法類。有沒有簡單的方法(除了子類)添加額外的實例變量或屬性(實例變量+ getter/setter)。 假設我想在UIButton中存儲UIColor參考。擴展現有加入的實例變量
PS:這是鐵道部的理論問題。我已經實現了使用子類化,但尋找「更好」的方式。
謝謝。
在Objective-C,如果我需要添加到UIButton的,我可以使用分類爲額外的方法類。有沒有簡單的方法(除了子類)添加額外的實例變量或屬性(實例變量+ getter/setter)。 假設我想在UIButton中存儲UIColor參考。擴展現有加入的實例變量
PS:這是鐵道部的理論問題。我已經實現了使用子類化,但尋找「更好」的方式。
謝謝。
一個解決方案是使用關聯引用;速度不如ivars快,但非常有用。
I.e.給定:
@interface UIButton (color)
@property (nonatomic, retain) UIColor *myPrefixColor;
@end
您可以實現此爲:
@implementation UIButton (color)
static const char *assocKey = "myPrefixColor associated object key";
- (void) setMyPrefixColor: (UIColor*) aColor
{
objc_setAssociatedObject(self, &assocKey, aColor, OBJC_ASSOCIATION_RETAIN);
}
- (UIColor*)myPrefixColor;
{
return objc_getAssociatedObject(self, &assocKey);
}
@end
的myPrefix
東西是因爲你應該永遠沒有前綴「時間與碰撞的機會東西這樣的方法添加到現有的類與現有的方法(你不知道)最小化。
我不認爲這是可能的ivars添加到類,你沒有來源。兩種技術接近:分類讓你添加實例的方法,而不是實例變量,和類信息,您可以通過聲明屬性添加實例變量,但是編譯器從類,執行塊內強制執行的那些屬性的方法,其執行您無權訪問。它們旨在幫助實現私有接口,而不是真正擴展已經存在的類。
特別是最後一句的+1。釘住它 – 2011-03-31 06:05:32
你可能是對的 - 它不是爲了添加i-vars而設計的。但無論如何 - 這是可能的! – 2012-05-20 19:55:41
@Gundis,謹慎地闡述一下? – 2012-05-21 01:50:30
不能使用類別添加高德。
我相信,在實現部分應該是'UIColor'代替'NSString',對不對? – OgreSwamp 2011-03-30 03:36:08
我認爲對於我的情況,使用子分類會更好,因爲我不需要100%UIButton實例的功能。無論如何,很高興知道。 Yup; – OgreSwamp 2011-03-30 03:37:40
Yup;肌肉記憶掩蓋了我一直這樣做的年數。謝謝。 :)而且,是的,子類化是要走的路。 – bbum 2011-03-30 03:53:50