我需要加载一个笔尖多少次?

时间:2010-06-04 17:46:21

标签: objective-c

不确定这是否是一个愚蠢的问题,但我需要加载任何特定的笔尖多少次?

我的理解是你在加载它时实际上是取消了它的归档,所以它随后可用于初始化吗?

示例:

controlsViewController *controls = [[controlsViewController alloc] initWithNibName:@"controlsViewController" bundle:nil];
[self addSubview:controls.view];

然后,我稍后发布这个viewcontroller:

[controls release];

下次我想初始化这个viewcontroller类型时,我是使用nib还是只是“init ??

3 个答案:

答案 0 :(得分:1)

我想我已经想到了这一点,所以我会尝试回答我自己的问题。

每次初始化想要使用它的视图控制器时,都需要加载nib。加载nib是UIViewController的'loadView'方法的替代方法,该方法涉及以编程方式绘制视图。

nib不是一个对象类,它不是像NSObject一样初始化到内存中的东西。它只是以编程方式加载视图的存档替代方案,每次要将其与视图控制器一起使用时都需要加载。

任何人都可以确认或否认吗?

答案 1 :(得分:1)

Spadict,这里有一些问题。首先,我比大多数人更关心琐碎的挑剔,但它有助于使语言正确。确实如此。让我们慢慢来..

如果您有一个类'ControlsViewController'(请注意大写C),您可以随时使用它。您可以随时实例化任意多个实例。阅读UIViewController的文档(我假设ControlsViewController是你编写的一个类,它是UIViewController的子类)告诉我们指定的初始化程序是 -initWithNibName:bundle:。这意味着通常我们会像这样使用它: -

ControlsViewController *controls = [[ControlsViewController alloc] initWithNibName:@"aNib" bundle:nil];

创建类实例的另一种方法是使用Interface Builder。在Interface Builder中,您可以创建任何您喜欢的类的实例,调整它们的属性,然后按原样将它们按照您的喜好配置到nib文件中。这是创建GUI实例,窗口,按钮,视图等的好方法,因为您可以直观地操作位置和大小,并且可以通过拖放操作向视图添加按钮或者向窗口添加视图 - 这比编码容易。

.nib文件与.zip文件相当。我们并不关心.nib文件 - 我们关心我们在其中存档的对象的实例。我们不是取消归档 .nib文件,我们取消归档我们使用Interface Builder创建的对象,然后归档为nib文件。

每当我们加载nib文件时,我们都会重新创建其中的对象,就像我们保存笔尖时一样。作为一个例子: - 在Interface Builder中我创建一个Window,我将它的背景颜色设置为黑色,宽度为600px。我将它保存到一个笔尖(这个笔尖中有一个窗口对象 - 但是对于有多少个对象或什么类型没有限制)。

当我运行应用程序时,我会加载.nib 5次。我现在有5个Windows,背景为600px的黑色背景。

UIViewController的指定初始化程序将nib的名称作为它的第一个参数。当我们创建一个UIViewController实例时,它将调用'-loadView'来加载我们传入的nib,取消归档其中的对象。你永远不需要调用'-loadview'并且使用nib绝不是这种方法的替代方法。

因此,可以以编程方式创建视图,或使用Interface Builder创建视图,然后从nib加载。这些“都不涉及以编程方式绘制视图”。一旦你有了一个视图你可以告诉它绘制,你可以每秒做50次,或者你可以做一次,但这是一个单独的操作。

答案 2 :(得分:0)

Nib文件只是一组已序列化的用户界面对象。执行[controller initWithNibName:@"file"]时,对象将从文件重建到内存中。 Interface Builder中的文件所有者是发送controller消息的initWithNibName:对象的替代品。因此,无论您从文件所有者与“界面”构建器中的视图建立的连接在加载笔尖时都连接到controller对象。至少这可能是view的{​​{1}}属性。

所有这一切的结果就是当你UIViewController时,[controller release]对象也将释放它的所有引用,其中包括从笔尖加载的那些对象。所以是的,你需要重新加载nib,因为所有这些对象都被释放了。

一句警告。我看到你在做controller。如果在释放控制器之前没有执行[self addSubview:controls.view]之类的操作,则基本视图仍然保留对所有内容的引用。 (至少我认为这是真的。)