什么是现代运行时?

时间:2011-07-06 06:54:11

标签: objective-c ios ios4

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

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

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

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

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

1 个答案:

答案 0 :(得分:10)

可以使用与合成属性相同的名称直接访问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

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

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

在Objective-C运行时参考的"Mac OS X Version 10.5 Delta"章节中,您可以看到其他更改但未经解释的内容。