0

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

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

我没有收到编译器错误,但我注意到 Xcode 并没有UIView像往常那样突出显示。我是否使用不良做法进行初始化?

4

5 回答 5

3

我看到该代码有两个问题:

  1. Objective-C 不保证局部变量的初始化,所以view可能是 0、指向其他东西的指针或垃圾值。
  2. 即使 Objecitve-C 确实为您初始化了变量,在声明后立即测试它的值也没有多大意义。

您实际上是在其他地方将其声明为实例变量吗?

至于突出显示,哪个“UIView”没有突出显示?两个都?我会尝试重新加载文件或重新启动 Xcode。

要解决我命名的两个问题,请将其替换为以下代码:

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

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

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

于 2012-07-02T16:16:22.217 回答
2

你不会声明一个本地变量然后检查它是否为 nil - 没有意义。

另一方面,如果它是一个属性,那么是的,惰性实例化:

if (!myView) {
    myView = [[UIView alloc] init];
}
于 2012-07-02T16:16:06.677 回答
1

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

如果 view 是 ivar,那就不同了。这些在实例构造时被初始化为零。

于 2012-07-02T16:16:12.500 回答
0

是的,这是一个很好的方法。如果你愿意,你可以把 if 语句放在一个叫做 view 的方法中,让它自己返回;这被称为惰性实例化,非常普遍和被接受。

于 2012-07-02T16:13:05.310 回答
0

事实上,这很混乱,没有真正的意义。为什么要在分配局部变量之前检查它?如果这被更改并且这实际上是一种延迟加载实例变量或属性的方法,那么是的,这是一个好方法。如果这只是一个普通变量,那么它充其量只是噪音,最坏的情况是您创建了一个悬空指针。

于 2012-07-02T16:16:52.057 回答