我知道我们可以使用关联引用来调用类IVAR类行为。但是,为什么不能在类别中声明新的反义词的具体原因是什么呢?
是因为我们会侵犯班级的私人空间吗?或者还有其他原因吗?如果是的话,我将欣赏一个例子,它展示了声明IVARS在分类中打破其中断的能力。

最佳答案

把objective-c的ivar想象成一个普通的c结构。当实例化类的实例时,创建的内存块大到足以容纳该结构。
假设您有一个NSString。编译了大量的现有代码以使用NSString。很多代码都内置在库和框架中。编译后的代码是已知的:NSString的IVARS取X个字节,并在该内存中的某些给定偏移量。
现在在您自己的小项目中,假设您在NSString上创建了一个类别,并希望添加一个ivar。理论上,项目中任何包含类别头文件的代码都会知道这个“new”NSString(加上类别)的大小需要x+y字节。这很像一个子类。这个新编译的代码可以正确地处理额外的ivar。
但是,所有预编译的代码、库和框架都不知道额外的ivar。当在那里创建了NSString实例时,内存仅为X字节,而不是x+y字节。当应用程序代码获得对较小的内存块的引用并尝试访问IVAR类的字节时,就会出现混乱。事情会很顺利的。
对于一个普通的旧子类,一切正常,因为任何可以使用子类ivars的代码都知道子类的ivars。但是对于一个类别,预先存在的代码不知道添加的内容,并且不能为它们正确地创建空间。
我想我应该说明以上所有的猜测都是有根据的。我可能完全错了。至少看起来是合理的。:)

关于objective-c - 为什么类别不能有实例变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21035660/

10-12 14:43