什么是现代运行时?

Pab*_*blo 5 objective-c ios4 ios

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

- (void)dealloc {
    [property release];
    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

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

- (void)dealloc {
    [self setProperty:nil];
    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*ell 10

可以使用与合成属性相同的名称直接访问ivar.该@synthesize指令代表您创建ivar(如果尚不存在),并且因为它是编译器指令,所以ivar在编译时可用.请参阅Objective-C编程语言的声明属性章节中的"运行时差异".正如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
Run Code Online (Sandbox Code Playgroud)

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

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

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