添加一个属性到我所有的UIControls

我试图做到这一点,使我的应用程序( UIButtonUISlider等)中的每个UIControl都具有特殊的额外属性,我添加到他们。

我试图通过创build一个UIControl类别并在需要的地方导入它来实现这一点,但我有问题。

这是我的代码。

我的setSpecialproperty方法被调用,但它似乎被调用在一个无限循环,直到应用程序崩溃。

你能告诉我什么我做错了或build议一个更聪明的方式来添加一个属性到我所有的UIControls

 @interface UIControl (MyControl) { } @property(nonatomic,strong) MySpecialProperty *specialproperty; -(void)setSpecialproperty:(MySpecialProperty*)param; @end 

////////

 #import "UIControl+MyControl.h" @implementation UIControl (MyControl) -(void)setSpecialproperty:(MySpecialProperty*)param { self.specialproperty=param; } 

///////////////

 #import "UIControl+MyControl.h" @implementation ViewController UIButton *abutton=[UIButton buttonWithType:UIButtonTypeCustom]; MySpecialProperty *prop=[MySpecialProperty alloc]init]; [abutton setSpecialproperty:prop]; 

虽然你不能通过一个类别添加一个iVar到UIControl,你可以添加关联对象,它可以用来执行很多相同的function。

所以,像这样在UIControl上创build一个类别:

 static char kControlNameKey; - (void) setControlName: (NSString *) name { objc_setAssociatedObject(self, &kControlNameKey, name, OBJC_ASSOCIATION_COPY); } - (NSString *) controlName { return (NSString *)objc_getAssociatedObject(array, &kControlNameKey); } 

除此之外还有更多,我猜你需要在设置一个新的之前检查一个关联是否存在,否则会泄漏,但这应该给你一个开始。

有关更多详细信息,请参阅Apple文档

self.specialproperty=param与调用[self setSpecialproperty]完全相同(请参阅这里的一些完全没有偏见的Obj-C点符号的覆盖),这使得您的当前用法无限recursion。

你真正想要做的是:

 -(void)setSpecialproperty:(MySpecialProperty*)param { _specialproperty = param; } 

在哪里_specialproperty是隐式创build你的财产ivar

我假设你为什么实现你的setSpecialproperty setter有一些原因? 为什么不使用为你隐式创build的那个?

问题是你不能添加一个属性到一个类别,你可以添加行为(方法),但不是属性或属性,这只能做到扩展,你不能创buildSDK类的扩展

使用你的方法

改变你的方法名称

 -(void)setSpecialproperty:(MySpecialProperty *)specialproperty -(void)setSpecialproperty:(MySpecialProperty*)specialproperty { if(_specialproperty!=specialproperty) _specialproperty = specialproperty; } 

并把你的specialProperty合成为

 @synthesize specialproperty=_specialproperty;