gpt4 book ai didi

iphone - 在 iPhone Development/Objective-C 中初始化实例变量

转载 作者:可可西里 更新时间:2023-11-01 03:31:58 26 4
gpt4 key购买 nike

作为 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 方法中,并且一个与分配)。

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 方法中,和一个与分配)。所以最好的做法是创建一个新的临时变量,初始化临时变量,将你的实例变量设置为临时变量,然后释放临时变量。综合 setter 方法将为您保留变量。

b) 便捷方法

- (void) viewDidLoad // or - (void) loadView if you implemented your view programmatically
{
[super viewDidLoad];

[self setInstanceVariable: [InstanceVariableClass instanceVariableClassWithInt:1]];
}

在初始化方法之外初始化一个实例变量,我们可以简单地使用我们的setter方法来设置和保留生成的对象。便捷方法(如果正确实现)将自动释放它返回的对象,所以我们不必担心双重保留它。

这就是我目前所拥有的。如果有人能在我的推理中发现任何缺陷,或者想到我忘记包括的任何其他场景,请告诉我。谢谢。

最佳答案

1a) 完美,除此之外:

call retain on itself automatically

instanceArray 不会保留自身 - 它只是分配给为您的实例保留的原始内存。

你做对的一个关键部分是你应该 avoid using the accessors in partially constructed/destructed states 很多人都忽视了这一点.原因不仅在于引用计数,还在于这些状态下的正确程序流。

1b) 将 NSArray 属性声明为 retain 是极其罕见的(对我而言)——您应该改用 copyYour initializer should agree with the semantics of your property ,因此在大多数情况下,您会将其更改为 instanceArray = [parameterArray copy];

1c) 看起来不错,但您还应该考虑我在 1a 和 1b 中提出的观点。

2) 好吧,这真的取决于。惰性初始化并不总是最好的。在某些情况下,在初始化程序中初始化 ivar 会更好,而在某些情况下,则在加载 View 时进行初始化。请记住,您的 vc 可能已卸载,并且在加载时破坏您创建的内容是很典型的。所以,确实没有硬性规定——如果创建某些东西需要时间,或者它必须在重新加载 vc 的情况下持续存在,那么在初始化程序中处理它可能更合乎逻辑。当延迟初始化更可取时,这些示例看起来不错。

关于iphone - 在 iPhone Development/Objective-C 中初始化实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8075632/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com