Objective-C,为什么类别可以向现有类添加方法而不是属性

时间:2014-05-23 14:23:09

标签: objective-c runtime categories

这个问题可能不那么实用。这是纯粹的好奇心。

为什么ObjC中的类别无法向现有类添加属性?

“要向现有类添加属性,您应该使用关联引用”不赞赏这种答案。

由于

修改

在阅读答案之后,我现在明白,类别不能添加属性或更准确地使用类别中的属性是不正确的。我试图在类别实现中使用自定义setter和getter声明属性。它工作正常。

所以@jlehr是对的,这是问题Why can't categories have instance variables?的重复,并且有一个很好的答案为什么

3 个答案:

答案 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结构,之后由于显而易见的原因无法更改。这就是语言的运作方式。