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

Mat*_*rix 0 iphone

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

Mik*_*ler 10

您可以使用Objective-C关联引用.您可以在此处阅读有关它们的Apple文档:关联参考

基本上,这允许您使用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);
Run Code Online (Sandbox Code Playgroud)

要再次获取关联对象:

id value = objc_getAssociatedObject(theInstanceToAddYourObjectTo, &key);
Run Code Online (Sandbox Code Playgroud)

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

objc_setAssociatedObject(theInstanceToAddYourObjectTo,
                         &key,
                         nil,
                         OBJC_ASSOCIATION_ASSIGN);
Run Code Online (Sandbox Code Playgroud)

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

  • 好吧,您可能希望使用类别向现有类添加属性.为此,您只需将setter/getter定义为使用objc_setAssociatedObject等,而不是@synthesizing属性. (2认同)