当前位置:  开发笔记 > IOS > 正文

现代Objective C运行时中ivar合成的基本机制是什么

如何解决《现代ObjectiveC运行时中ivar合成的基本机制是什么》经验,为你挑选了1个好方法。

现代(64位OS X和iPhone OS)Objective C运行时的一个特性是属性能够动态合成ivars而无需在类中明确声明它们:

@interface MyClass : NSObject {
//  NSString *name; unnecessary on modern runtimes
}

@property (retain) NSStrng *name;

@end

@implementation MyClass

@synthesize name;

@end

在我的相当多的代码中,我使用自定义getter实现来初始化属性:

- (NSString *) name {
  if (!name) {
    name = @"Louis";
  }

  return name;
}

以上与合成的ivars不兼容,因为它需要访问未在标题中声明的ivar.由于各种原因,我想更新一些我的个人框架,以便在现代运行时构建时使用合成的ivars,需要修改上述代码以使用合成的ivars来实现该目标.

虽然Objective C 2.0文档指出现代运行时的合成访问器将在首次使用时合成ivar.它没有指定使用什么低级机制来执行此操作.它是由class_getInstanceVariable()完成的,对class_addIvar()的限制是否松散,是否是一个未记录的函数在客观的C 2.0运行时?虽然我可以为支持我的属性的数据实现自己的副存储,但我更愿意使用合成访问器正在使用的机制.



1> Mark Bessey..:

我刚才再去看了一下文档,我觉得你误读了.合成的ivars是在编译时创建的,而不是在运行时创建的.

根据Objective-C 2.0文档:

依赖于运行时的行为存在差异(另请参阅"运行时差异"):

对于遗留运行时,必须已在@interface块中声明实例变量.如果存在与属性相同名称和兼容类型的实例变量,则使用它 - 否则,您将收到编译器错误.

对于现代运行时,根据需要合成实例变量.如果已存在同名的实例变量,则使用它.

所以你需要做的就是声明你需要的实例变量,同样的代码将适用于两个运行时......


通过gcc的合成器代码阅读之后,这实际上是在发生什么.
推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有