这是一个非常基本的问题。当我像这样初始化一个对象时......
UIView *view;
if (!view) {
view = [[UIView alloc] init];
}
// Do something with view
我没有收到编译器错误,但我注意到 Xcode 并没有UIView
像往常那样突出显示。我是否使用不良做法进行初始化?
这是一个非常基本的问题。当我像这样初始化一个对象时......
UIView *view;
if (!view) {
view = [[UIView alloc] init];
}
// Do something with view
我没有收到编译器错误,但我注意到 Xcode 并没有UIView
像往常那样突出显示。我是否使用不良做法进行初始化?
我看到该代码有两个问题:
view
可能是 0、指向其他东西的指针或垃圾值。您实际上是在其他地方将其声明为实例变量吗?
至于突出显示,哪个“UIView”没有突出显示?两个都?我会尝试重新加载文件或重新启动 Xcode。
要解决我命名的两个问题,请将其替换为以下代码:
UIView *view = [[UIView alloc] init];
这引发了另一个问题:在 ARC 下,当变量超出范围时,您新分配的视图将被释放,除非您将其存储在实例变量中或框架(例如 superview)将其存储在其他地方。
如果您使用手动保留释放而不是 ARC,则每次调用该方法时都会泄漏 UIView。
你不会声明一个本地变量然后检查它是否为 nil - 没有意义。
另一方面,如果它是一个属性,那么是的,惰性实例化:
if (!myView) {
myView = [[UIView alloc] init];
}
请让第一行和第二行之间有一些代码。因为如果不是,您正在读取未初始化的局部变量的值,这是未定义的行为。这意味着 - 它可能纯粹是偶然的非零。
如果 view 是 ivar,那就不同了。这些在实例构造时被初始化为零。
是的,这是一个很好的方法。如果你愿意,你可以把 if 语句放在一个叫做 view 的方法中,让它自己返回;这被称为惰性实例化,非常普遍和被接受。
事实上,这很混乱,没有真正的意义。为什么要在分配局部变量之前检查它?如果这被更改并且这实际上是一种延迟加载实例变量或属性的方法,那么是的,这是一个好方法。如果这只是一个普通变量,那么它充其量只是噪音,最坏的情况是您创建了一个悬空指针。