在我的项目中,我正在创建没有IB的UIViewControllers,因此没有nib文件,所以所有控制器内容(可见或其他)都是以 loadView:编程创建的。因此,我基本上“初始化” loadView:中的所有对象。这是正确的做法吗?或者我应该将所有初始化放在 initWithNibName:bundle:?
因为它是我在控制器的 loadView:中创建我的UIView子视图的实例,如下所示:
self.mySubView = [[SubView alloc] initWithFrame:aframe];
[self.view addSubView:self.mySubView];
[self.mySubView release];
所以我使用合成属性实例化其中几个子视图。由于我不在初始化程序中,因此我通过调用上面的访问器来创建这些视图。但是,它确实感觉这本质上是初始化代码,所以也许我应该直接调用我的ivars上的alloc / init而不是通过访问器,这导致我认为我应该在 initWithNibName:bundle中执行此操作:
如果我在 loadView:中初始化对象是正确的,我真的应该使用alloc / init的访问器吗?
有什么想法?
答案 0 :(得分:0)
在调用initWithNibName:bundle:
时(我假设您没有使用nib文件),尚未创建视图控制器的受控视图。它是在第一次引用self.view
时创建的。最好不要在init方法中执行此操作。因此,最好不要在init方法中创建子视图。
第一次以任何方式引用self.view
时,视图控制器会自动调用loadView
方法。您的工作是此时以编程方式创建受控视图。在loadView
方法中创建子视图是完全可以的,如果您遵循我建议的良好实践,您将需要。但是,您只应在self.view
方法中引用loadView
,以便为其分配受控视图,这意味着您只应在loadView
方法中引用它一次。
您不应该在loadView
方法中执行此操作:
[self.view addSubView:self.mySubView];
这是因为您在调用创建它的方法中引用受控视图。 {1}}不是为您创建的,您必须在'loadView`方法中创建它。
相反,使用局部变量创建受控视图,然后在self.view
方法的末尾将该局部变量分配给self.view
。