2010-08-30 31 views
0

我们知道,使用类别我们可以添加功能到现有的类。但我有一个疑问,是否有可能将对象或数据成员添加到目标C中的类别?是否可以将对象或数据成员添加到目标C中的类别?

+0

我描述了一个访问的工作方法[这里](http://stackoverflow.com/questions/4887004/category-like-extension-for-instance-variables/4899521#4899521),它模拟了这种行为,并且不需要额外的run-时间例程的实现。 – 2011-02-09 15:21:15

回答

0

你是对的,你不能通过一个类别添加实例变量/成员/属性。您只能使用您正在扩展的类已经提供的内容,但当然您的新方法在被调用时可能会收到参数。

+2

您可以使用Objective-C关联的对象。看到我的答案。 – 2010-08-30 14:13:27

10

您可以使用Objective-C关联的引用。你可以在这里阅读苹果文档关于他们:Associative References

基本上,这可以让你连接对象使用objc_setAssociatedObject功能的实例如下:

#import <objc/runtime.h> 

/* The key for the associated object must be void* so you can use a static variable to get a 
    unique pointer. Alternatively you can use _cmd since selectors are constant and unique. */ 
static char key; 
objc_setAssociatedObject(theInstanceToAddYourObjectTo, 
         &key, 
         @"The object you want to add", 
         OBJC_ASSOCIATION_RETAIN); 

要再次获得关联的对象:

id value = objc_getAssociatedObject(theInstanceToAddYourObjectTo, &key); 

并清除关联的对象,通过零作为值:

objc_setAssociatedObject(theInstanceToAddYourObjectTo, 
         &key, 
         nil, 
         OBJC_ASSOCIATION_ASSIGN); 

因此,使用这些功能,你可以添加自己的实例变量,使用的分类方法等

+0

但是,这仅限于手动添加的对象,对吗?毕竟,类别的一大优点是您不必担心哪个对象可以使用添加的功能...... – Toastor 2010-08-30 16:08:35

+2

大概可能您希望使用类别将属性添加到现有类中。要做到这一点,你只需定义setter/getter使用objc_setAssociatedObject等,而不是@synthesizing属性。 – 2010-08-31 14:15:00

0

的问题是,与关联对象是不可能从方法

- (void)encodeWithCoder:(NSCoder *)aCoder 
相关问题