Objective c 扩展UIKit类的类属性(无法访问@implementation)
可能重复:Objective c 扩展UIKit类的类属性(无法访问@implementation),objective-c,ios,uikit,Objective C,Ios,Uikit,可能重复: 我正试图找到一种扩展UIButton的方法,这样它就可以拥有类似 @property(assign, nonatomic) id userInfos; 没有子类化它 这可能吗 在我的情况下,按钮.tag是不够的 好的,这里总是有更好的答案 您可以使用objective-c运行时的关联对象功能将一个对象与另一个对象关联: void objc_setAssociatedObject(id对象,void*键,id值,objc_AssociationPolicy策略) id objc_g
我正试图找到一种扩展UIButton的方法,这样它就可以拥有类似
@property(assign, nonatomic) id userInfos;
没有子类化它
这可能吗
在我的情况下,按钮.tag
是不够的
好的,这里总是有更好的答案
您可以使用objective-c运行时的关联对象功能将一个对象与另一个对象关联: void objc_setAssociatedObject(id对象,void*键,id值,objc_AssociationPolicy策略) id objc_getAssociatedObject(id对象,void*键) 此外,投票结束。副本: 在许多其他方面 编辑:
我也同意@Paul.s对你问题的评论。将数据附加到按钮听起来很混乱。在不知道您在做什么的情况下,我建议您标记按钮,然后让您的视图控制器根据按钮的标记获取所需的任何数据。使用Objective-C关联对象非常简单: 在标题中:
@interface UIButton (MyCustomProperty)
@property (readwrite, retain, nonatomic) id myCustomProperty;
@end
在您的实现文件中:
#include <objc/runtime.h>
/* Associated objects need a unique memory location to use as a key. */
static char MyCustomPropertyKey = 0;
@implementation UIButton (MyCustomProperty)
/* Use @dynamic to tell the compiler you're handling the accessors yourself. */
@dynamic myCustomProperty;
- (id)myCustomProperty {
return objc_getAssociatedObject(self, &MyCustomPropertyKey);
}
- (void)setMyCustomProperty: (id)anObject {
objc_setAssociatedObject(self, &MyCustomPropertyKey, anObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
#包括
/*关联的对象需要一个唯一的内存位置来用作键*/
静态字符MyCustomPropertyKey=0;
@实现UIButton(MyCustomProperty)
/*使用@dynamic告诉编译器您自己正在处理访问器*/
@动态特性;
-(id)myCustomProperty{
返回objc_getAssociatedObject(self和MyCustomPropertyKey);
}
-(void)setMyCustomProperty:(id)一个对象{
objc_setAssociatedObject(self和MyCustomPropertyKey、anObject、objc_ASSOCIATION_RETAIN_NONATOMIC);
}
@结束
就这样 您想要的是创建一个UIButton。类别的设计是为了扩展现有类的功能。一旦创建了一个设置,您只需导入类别,就可以在为其设计的类的任何实例上使用它的功能。出于兴趣,查看您实际添加的内容?我觉得这是一种代码味道,我同意保罗的观点。听起来这里没有遵循MVC分离。按钮不应该知道应用程序其余部分的情况。按钮只是通知视图控制器状态更改(按下、释放等)。拥有按钮的视图控制器应该处理这些事件并检索数据本身。正如人们在tableView中使用tag属性检索按钮的indexPath.row一样,我认为这是一种很好的方法,可以在选择器上获取我想要处理的对象,而不是在类中再次分叉它。尤其是在我的例子中,按钮是从核心数据nsset生成的。是的,这就是你要做的。通常,如果你有许多按钮调用相同的方法,你需要使用button.tag属性来知道哪个按钮调用了选择器,并从标记中找到你想要使用的对象,但我认为如果你可以通过button并在方法中直接使用button.myObject。我正在尝试您的答案,请稍后回复。它起作用了!然而,我更喜欢OBJC_ASSOCIATION_ASSIGN my按钮必须能够沿着其选择器传递对象。:)Awesome
OBJC\u ASSOCIATION\u ASSIGN
将只使用弱引用。如果没有对对象的其他引用,它将被释放,您将得到一个悬空的指针,还有一些不好的事情™ 会发生的。除非您有特定的理由使用OBJC\u关联\u分配
,否则请使用OBJC\u关联\u保留\u非原子
。