这个问题可能不那么实用。这是纯粹的好奇心。
为什么ObjC中的类别无法向现有类添加属性?
“要向现有类添加属性,您应该使用关联引用”不赞赏这种答案。
由于
在阅读答案之后,我现在明白,类别不能添加属性或更准确地使用类别中的属性是不正确的。我试图在类别实现中使用自定义setter和getter声明属性。它工作正常。
所以@jlehr是对的,这是问题Why can't categories have instance variables?的重复,并且有一个很好的答案为什么
答案 0 :(得分:3)
可以在运行时加载类别。当发生这种情况时,它们实现的方法会动态地添加到类中。如果修改了类别以允许添加实例变量,那么在类别加载之前实例化的对象可能不够大,无法容纳新的实例变量。
答案 1 :(得分:1)
您可以向类别添加属性。您可以添加的是这些类别属性的实例变量。
您可以使用@property
声明创建一个类别,然后为该属性提供您自己的自定义setter和getter。一切正常。
也许更好的问题是"为什么不能在类别中添加实例变量"。在这种情况下,请参阅Why can't categories have instance variables?
答案 2 :(得分:0)
属性通常是带有getter和setter方法的ivar。您可以将这些方法添加到现有类中,但不能添加ivar。 Obj-C运行时函数class_addIvar
可以添加一个ivar,但它不适用于documentation
此函数只能在objc_allocateClassPair之后和objc_registerClassPair之前调用。不支持将实例变量添加到现有类中。
这就是为什么人们建议联想参考。这样你只能伪造一个伊娃。为什么 - 里面的Obj-C类只是一个C结构。已注册的类已经定义了C结构,之后由于显而易见的原因无法更改。这就是语言的运作方式。