【发布时间】:2011-11-10 06:13:29
【问题描述】:
作为 iPhone / Objective-C 开发的新手,我想问这个问题以确保我将在不同的场景中正确初始化实例变量。所以在下面,我将介绍一些场景,如果有人发现有什么不正确的地方,请告诉我。 (注意:对于我的示例,我将使用“instanceVariable”作为我们要初始化的实例变量,它是“InstanceVariableClass”类的对象。)
场景 1:在非 UIViewController 类中初始化
a) 新分配
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
instanceVariable = [[InstanceVariableClass alloc] init];
}
return self;
}
在初始化器中,直接访问变量(即不通过它的属性)并分配它是可以的。当您调用 alloc 时,新创建的对象将被自动保留,稍后当您将它与您的 getter 和 setter 方法一起使用时,它将完美地工作。您不想使用属性分配变量,即self.instanceVariable = [[InstanceVariableClass alloc] init];,否则您将保留它两次(一次在您的 setter 方法中,一次在 alloc 中)。
b) 参数
- (id)initWithFrame:(CGRect)frame object(InstanceVariableClass*) theInstanceVariable {
self = [super initWithFrame:frame];
if (self) {
instanceVariable = [theInstanceVariable retain];
}
return self;
}
再一次,可以在初始化程序中直接访问您的实例变量。由于您没有分配变量,只是想拥有一个传递给您的副本,因此您需要让它显式地保留自己。如果您使用了 setter 方法,它会为您保留它,但要避免访问初始化程序中的属性。
c) 便捷方法
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
instanceVariable = [[InstanceVariableClass returnInitializedObject] retain];
}
return self;
}
当使用便捷方法返回一个新对象时,您也需要显式保留,原因与参数相同。便利方法(如果实施得当)将自动释放它生成的新对象,因此我们不必担心双重保留它。
场景 2:在 UIViewController 类中初始化
a) 新分配
- (void) viewDidLoad // or - (void) loadView if you implemented your view programmatically
{
[super viewDidLoad];
InstanceVariableClass *tempInstanceVariable = [[InstanceVariableClass alloc] init];
[self setInstanceVariable: tempInstanceVariable];
[tempInstanceVariable release];
}
在 UIViewController 中,您希望在 viewDidLoad 方法中初始化实例变量以采用延迟加载的做法,或者仅在您需要它们的确切时刻加载变量。在初始化器之外,直接访问变量是不好的做法,所以我们现在将使用我们的综合 setter 方法来设置变量。您不想使用setter 方法分配变量,即[self setInstanceVariable] = [[InstanceVariableClass alloc] init];,否则您将保留它两次(一次在您的setter 方法中,一次在alloc 中)。所以最好的做法是创建一个新的临时变量,初始化临时变量,将你的实例变量设置为临时变量,然后释放临时变量。 synthesize setter 方法将为您保留变量。
b) 便捷方法
- (void) viewDidLoad // or - (void) loadView if you implemented your view programmatically
{
[super viewDidLoad];
[self setInstanceVariable: [InstanceVariableClass instanceVariableClassWithInt:1]];
}
在初始化方法之外初始化实例变量,我们可以简单地使用我们的 setter 方法来设置和保留生成的对象。便利方法(如果实施得当)将自动释放它返回的对象,因此我们不必担心双重保留它。
这就是我目前所拥有的。如果有人能在我的推理中发现任何缺陷,或者想到我忘记包含的任何其他场景,请告诉我。谢谢。
【问题讨论】:
标签: iphone objective-c ios cocoa-touch design-patterns