你的代码是正确的。
一般规则是,对于您在@interface 中声明的所有变量,您必须在-dealloc 中清理它们。一些变量需要被释放,其他的只需要被 nil'd,这取决于你如何声明 @property。
在你上面的例子中,temp 可能从来没有被你明确地赋予一个值,但是当一个实例时,ObjC 运行时会将 temp 的值初始化为 nil你的班级被分配了。
向 nil 对象发送 -release 通常不是问题,因此 [temp release] 很好。这是一个无操作。当 temp 在-dealloc, 中具有非零值时,[temp release] 开始释放内存。
如果您需要 temp 在创建时具有非零值,则需要实现 -init 方法并确保它获得一些值。虽然您的类在没有 -init 方法的情况下是合法且实用的,但您确实应该养成习惯,在您设计的每个自定义类中都包含一个。
您至少需要默认初始化程序:-init。您可能还想设计一个更详细的初始化程序,可用于为您的 temp ivar 提供一个值,例如 -initWithImage:
您还应该在课堂上包括以下内容:
@implementation MyClass
...
- (id) init {
self = [super init];
if (self != nil) {
// The minimal default initializer.
// temp will already have a value of nil, so you don't need necessarily
// need to do anything more, unless temp needs a real value on initialization.
}
return self;
}
- (void) dealloc {
...
}
@结束
要实现一个更详细的初始化器,称为 designated 初始化器,您可以这样:
@implementation MyClass
...
- (id) initWithImage:(UIImage *)newImage {
self = [super init];
if (self != nil) {
temp = [newImage retain];
}
return self;
}
// Implement the default initializer using your more detailed initializer.
- (id) init {
// In this default initializer, every new instance comes with a temp image!
return [self initWithImage:[UIImage imageNamed:@"foobar"]];
}
- (void) dealloc {
...
}
@end
这里,指定初始化器-initWithImage:是权威初始化器。所有其他初始化程序,包括 -init,都使用 -initWithImage: 实现。
您可以自行决定是否实现超出最小默认初始值设定项的任何初始值设定项。也许-init 足以满足您的目的。没关系。有时更详细的初始化器使使用类更方便。经验(和原力)将成为您的向导。
请注意,我没有在任一初始化方法中使用生成的属性访问器。如果环境不要求您,您通常应避免在 -init 方法和 -dealloc 中使用属性访问器,主要是因为自动键值编码通知的副作用可能会带来令人头疼的问题。
初始化方法和dealloc方法在一个类中扮演着特殊的角色。作为类设计者,您有责任在这些方法中设置和清理实例变量。一个好的经验法则是将合成属性访问器的使用留给类的调用者,以及类中其他方法的实现。
在初始化实例或解除分配时,您可以而且应该直接接触 ivars。他们是你的。您声明了它们,因此您可以直接处理它们。在您的类中实现其他方法时,您通常应该使用属性访问器。
JeremyP 的 Cocoa 对象概念文档链接是一个很好的链接。您绝对应该阅读有关对象的部分,并在获得更多编写自己的自定义类的经验时定期重新阅读。最终,一切都会开始变得有意义。