【问题标题】:What is modern runtime?什么是现代运行时?
【发布时间】:2011-09-29 08:57:07
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 那篇文章没有回答什么是“现代运行时”。
  • “你不能直接访问实例变量”位曾经是旧编译器的情况。使用足够现代的编译器,您可以访问为声明的属性自动合成的支持实例变量。

标签: objective-c ios ios4


【解决方案1】:

可以使用与合成属性相同的名称直接访问 ivar。 @synthesize 指令代表您创建 ivar(如果尚不存在),并且由于这是一个编译器指令,因此 ivar 在编译时可用。请参阅 Objective-C 编程语言的声明属性一章中的 "Runtime Difference"。正如 Abizern 在评论中指出的那样,也可以为 ivar 指定任何您喜欢的名称:@synthesize coffee=tea; -- 这里,tea 是 ivar,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

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

Objective-C 运行时编程指南的noted in "Runtime Versions and Platforms" 的另一个关键区别是实例变量是“非脆弱的”。在 ivar 存储和访问中添加了一层间接,它允许类添加变量而不影响派生类的存储。它还可能有助于实例变量的合成。 Greg Parker has an explanation 涉及小猫,在 Mike Ash 的 2009 runtime writeup 中传递了对它的引用,并且 Bavarious 在 SO 上有一个 swell post 关于 ivar 存储和类扩展。

您可以在 Objective-C 运行时参考的"Mac OS X Version 10.5 Delta" 章节中看到其他发生的变化,尽管没有解释。

【讨论】:

  • 确实如此。您甚至可以在 @synthesize 中更改支持 iVar 的名称
  • “声明的属性是现代运行时的一个特性”不是真的。合成 ivars 是现代运行时的一项功能,但您可以在 OS X 上使用 32 位和 64 位的声明属性,这意味着这两种运行时。
  • @BJ Homer:感谢您的留言。我想这是围绕“现代运行时”混淆的一部分,ObjC-2.0 和 Leopard 与 MR 同时引入了属性。
猜你喜欢
  • 2011-04-23
  • 1970-01-01
  • 2023-03-15
  • 2017-10-19
  • 2019-11-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2022-07-08
相关资源
最近更新 更多