- (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方法来设置和保留生成的对象。如果方便方法(如果正确实现)已经释放了返回的对象,因此我们不必担心重复保留它。
这就是我目前的情况。如果有人发现我的推理有任何缺陷,或者想到我忘记包含的任何其他情况,请告诉我。谢谢。
dealloc
方法中被发送相应的释放消息。实例的alloc
应该与其初始化器配对使用。 - justin