如何使用局部变量初始化对象

时间:2012-07-02 16:11:06

标签: objective-c ios

这是一个非常基本的问题。当我初始化像这样的对象时......

UIView *view;
if (!view) {
    view = [[UIView alloc] init];
}
// Do something with view

我没有编译器错误,但我注意到Xcode没有像通常那样突出显示UIView。我使用不好的做法进行初始化吗?

5 个答案:

答案 0 :(得分:3)

我发现该代码存在两个问题:

  1. Objective-C不保证本地变量的初始化,因此view可能为0,指向其他内容的指针或垃圾值。
  2. 即使Objecitve-C为您初始化变量,在声明后立即测试其值也没有多大意义。
  3. 你实际上是在其他地方将其声明为实例变量吗?

    就突出显示而言,“UIView”未突出显示?都?我尝试重新加载文件或重新启动Xcode。

    要修复我命名的两个问题,请使用以下代码替换它:

    UIView *view = [[UIView alloc] init];
    

    这引发了另一个问题:在ARC下,当变量超出范围时,新分配的视图将被释放,除非您将其存储在实例变量中,或者框架(例如superview)将其存储在其他位置。

    如果您使用手动保留释放而不是ARC,则每次调用该方法时都会泄漏UIView。

答案 1 :(得分:2)

你不会声明一个局部变量然后检查它是否为零 - 没有意义。

另一方面,如果它是属性,那么是,lazy instantiantion:

if (!myView) {
    myView = [[UIView alloc] init];
}

答案 2 :(得分:1)

请让第一行和第二行之间有一些代码。因为如果没有,你正在读取未初始化的局部变量的值,这是一个未定义的行为。这意味着 - 纯粹的意外可能是非零的。

如果视图是ivar,那就不同了。在实例构建时将它们初始化为零。

答案 3 :(得分:0)

是的,这是一个很好的方法。如果需要,可以将if语句放在名为view的方法中,并使其自行返回;这被称为懒惰的实例,非常普遍并被接受。

答案 4 :(得分:0)

实际上,这很混乱,并没有真正的意义。为什么在分配之前检查局部变量?如果这被改变了,这实际上是一个延迟加载实例变量或属性的方法,那么这是一个好方法。如果这只是一个正常的变量,那么它只是最好的噪声,最坏的时候你创建了一个悬空指针。