是否可以将对象或数据成员添加到目标C中的类别?

时间:2010-08-30 11:27:47

标签: iphone

我们知道使用类别我们可以向现有类添加函数。但我怀疑,是否有可能在目标C ??

中将对象或数据成员添加到类别中

3 个答案:

答案 0 :(得分:10)

您可以使用Objective-C相关参考。您可以在此处阅读有关它们的Apple文档: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);

要清除关联的对象,请将nil作为值传递:

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

因此,使用这些函数,您可以添加自己的实例变量,以便在类别方法等中使用。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

问题是关联对象无法从方法

访问它
  - (void)encodeWithCoder:(NSCoder *)aCoder