这是一个非常基本的问题。当我初始化像这样的对象时......
UIView *view;
if (!view) {
view = [[UIView alloc] init];
}
// Do something with view
我没有编译器错误,但我注意到Xcode没有像通常那样突出显示UIView
。我使用不好的做法进行初始化吗?
答案 0 :(得分:3)
我发现该代码存在两个问题:
view
可能为0,指向其他内容的指针或垃圾值。你实际上是在其他地方将其声明为实例变量吗?
就突出显示而言,“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)
答案 4 :(得分:0)
实际上,这很混乱,并没有真正的意义。为什么在分配之前检查局部变量?如果这被改变了,这实际上是一个延迟加载实例变量或属性的方法,那么这是一个好方法。如果这只是一个正常的变量,那么它只是最好的噪声,最坏的时候你创建了一个悬空指针。