我们知道,使用类别我们可以添加功能到现有的类。但我有一个疑问,是否有可能将对象或数据成员添加到目标C中的类别?是否可以将对象或数据成员添加到目标C中的类别?
回答
你是对的,你不能通过一个类别添加实例变量/成员/属性。您只能使用您正在扩展的类已经提供的内容,但当然您的新方法在被调用时可能会收到参数。
您可以使用Objective-C关联的对象。看到我的答案。 – 2010-08-30 14:13:27
您可以使用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);
因此,使用这些功能,你可以添加自己的实例变量,使用的分类方法等
但是,这仅限于手动添加的对象,对吗?毕竟,类别的一大优点是您不必担心哪个对象可以使用添加的功能...... – Toastor 2010-08-30 16:08:35
大概可能您希望使用类别将属性添加到现有类中。要做到这一点,你只需定义setter/getter使用objc_setAssociatedObject等,而不是@synthesizing属性。 – 2010-08-31 14:15:00
的问题是,与关联对象是不可能从方法
- (void)encodeWithCoder:(NSCoder *)aCoder
- 1. 是否可以将目标c中的对象降级到其超类?
- 2. 作为目标C中的数据成员的对象目标C中的数据成员
- 3. 是否可以在PHP中动态添加数据成员?
- 4. 如果我将成员添加到类定义中,是否可以反序列化存储的对象?
- 5. 是否可以知道添加对象的数组(或数组)?
- 6. 是否可以将模板添加到数据类的getter/setter?
- 7. 是否可以在C++的类中初始化静态常量成员对象?
- 8. 是否可以在Android上向SharedPreferences添加数组或对象
- 9. 既可以将图像目标和对象目标添加到统一vuforia中的单个数据库?
- 10. 将C++对象添加到Objective-C类
- 11. 是否可以在离子中添加目标c代码?
- 12. 将数据成员注入到对象
- 13. 添加成员到现有的对象
- 14. C#将项目添加到JSON对象
- 15. 是否可以将方法添加到集合中的类中?
- 16. 是否可以将接口添加到.NET中的强类型数据集?
- 17. 类的对象可以是其他类的成员变量吗?
- 18. 是否可以添加类?
- 19. 成员函数是否可以创建同一个类的对象?
- 20. C++:在基类的成员函数中复制对象数据
- 21. 静态数据成员是否可以在C++中键入其容器类型?
- 22. 可以是一个类型的成员是一个目标?
- 23. 目标C++成员类
- 24. 是否可以将一个C数组添加到NSArray?
- 25. 将对象成员添加到OOD中的业务实体
- 26. 用C++中的成员整数ID标识类对象
- 27. C#:将数据添加到SQLMetal生成的数据库类?
- 28. C++分配成员的目标函数,类成员函数
- 29. 是否可以将值添加到js中某个对象的新属性?
- 30. 我可以将对象存储在Python类成员中吗?
我描述了一个访问的工作方法[这里](http://stackoverflow.com/questions/4887004/category-like-extension-for-instance-variables/4899521#4899521),它模拟了这种行为,并且不需要额外的run-时间例程的实现。 – 2011-02-09 15:21:15