什么是现代运行时?

注意:通常在dealloc方法中,您应该直接释放对象实例变量(而不是调用set访问器并传递nilas参数),如下例所示:

 - (void)dealloc { [property release]; [super dealloc]; } 

但是,如果使用现代运行时并合成实例变量,则无法直接访问实例变量,因此必须调用访问器方法:

 - (void)dealloc { [self setProperty:nil]; [super dealloc]; } 

iOS应用程序开发中的现代运行时到底是什么?

可以使用与合成属性相同的名称直接访问ivar。 @synthesize指令代表您创建ivar(如果尚不存在),并且因为它是编译器指令,所以ivar在编译时可用。 请参阅Objective-C编程语言的声明属性章节中的“运行时差异” 。 正如Abizern在评论中指出的那样,也可以为ivar指定你喜欢的名字: @synthesize coffee=tea; – 这里的tea是伊瓦尔和coffee

要使用ivar,只需像任何其他变量一样引用它,而不使用点语法。 以下是完全合法的,并按预期工作:

 @interface Grisby : NSObject {} @property (retain) NSObject * obj; @end @implementation Grisby @synthesize obj; - (void) dealloc { [obj release], obj = nil; [super dealloc]; } - (id) init { self = [super init]; if( !self ) return nil; obj = [NSObject new]; return self; } - (NSObject *) obj { return [[obj retain] autorelease]; } @end 

Mac OS X 10.5(Leopard)引入了“现代运行时”,作为向64位过渡的一部分。 所有版本的iOS都使用现代运行时。 合成的实例变量是现代运行时的一个特性,如上面提供的链接中所述。

Objective-C运行时编程指南的“运行时版本和平台”中提到的另一个关键差异是实例变量是“非易碎的”。 在ivar存储和访问中添加了一层间接,允许类添加变量而不影响派生类的存储。 它也可能促进实例变量合成。 格雷格帕克有一个涉及小猫的解释 ,在迈克阿什的2009年运行时写作中有传递参考,而在这里的巴伐利亚有一个关于伊娃存储和类扩展的膨胀post 。

在Objective-C运行时参考的“Mac OS X Version 10.5 Delta”一章中,您可以看到其他更改的内容,但没有说明。