数字1与其他两个数字的不同之处在于,前向声明了MyOtherObject类,以最大程度地减少编译器和链接器看到的代码量,并有可能避免循环引用。如果这样做,请记住将#import放入.m文件。
通过声明一个@property(并在.m中匹配@synthesize)文件,您可以使用指定的内存语义自动生成访问器方法。大多数对象的经验法则是保留,但是NSStrings应该使用复制。而Singleton和Delegates通常应使用Assign。手写访问器既繁琐又容易出错,因此可以节省很多打字和愚蠢的错误。
同样,声明综合属性使您可以使用点符号来调用访问器方法,如下所示:
self.otherObj = someOtherNewObject;
MyOtherObject *thingee = self.otherObj;
而不是普通的消息传递方式:
[self setOtherObject:someOtherNewObject];
MyOtherObject *thingee = [self otherObj];
在后台,您实际上是在调用一个如下所示的方法:
- (void) setOtherObj:(MyOtherObject *)anOtherObject {
if (otherObject == anOtherObject) {
return;
}
MyOtherObject *oldOtherObject = otherObject;
otherObject = [anOtherObject retain];
[oldOtherObject release];
}
…或这个
- (MyOtherObject *) otherObject {
return otherObject;
}
臀部完全疼痛,对。现在,对班级中的每个ivar都这样做。如果您做的不正确,则会导致内存泄漏。最好只是让编译器完成工作。
我看到1号没有ivar。假设这不是打字错误,那很好,因为@property / @synthesize指令还将在后台为您声明一个ivar。我相信这是Mac OS X的新功能-Snow Leopard和iOS4。
3号没有生成这些访问器,因此您必须自己编写它们。如果您希望访问器方法具有副作用,则可以执行标准的内存管理操作(如上所示),然后在访问器方法中执行所需的任何副作用。如果您合成一个属性并编写自己的属性,则您的版本具有优先权。
我涵盖了一切吗?