注意:通常在dealloc
方法中,您应该直接释放对象实例变量(而不是调用set访问器并传递nilas参数),如下例所示:
- (void)dealloc {
[property release];
[super dealloc];
}
但是,如果您正在使用现代运行时并合成实例变量,则无法直接访问实例变量,因此必须调用访问器方法:
- (void)dealloc {
[self setProperty:nil];
[super dealloc];
}
iOS应用程序开发中的现代运行时到底是什么?
答案 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"章节中,您可以看到其他更改但未经解释的内容。