2010-06-04 92 views
1

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

我的理解是,您在加载时正在有效地解除对笔尖的存档,随后可以随时进行初始化吗?

例子:

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

然后,后来我释放这个视图 - 控制:

[controls release]; 

下一次我想初始化这个视图 - 控制型,我用笔尖或只是“INIT?

回答

1

Spadict,这里有一些错误。首先,我关心比大多数人都少的挑剔,但它有助于让语言正确。真的是这样。让我们慢慢来吧..

如果你有一个类'ControlsViewController'(注意大写C),你可以随时使用它。你可以实例化尽可能多实例只要你喜欢,只要你喜欢。阅读UIViewController的文档(我在这里假设ControlsViewController是一个你写的类,它是UIViewController的一个子类)告诉我们指定的初始化器是-initWithNibName:bundle:。这意味着我们通常会像这样使用它: -

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

另一种创建类实例的方法是使用Interface Builder。在界面生成器中,您可以创建任意多个您喜欢的类的实例,调整它们的属性,然后按原样将它们保存为一个nib文件。这是创建GUI实例,窗口,按钮,视图等的好方法,因为您可以通过视觉操作位置和大小,并且可以通过拖放操作将按钮添加到视图或视图中,这比编码更容易。

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

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

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

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

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

+0

我对这种居高临下的态度并不热衷,但我的确把你的骆驼套的建议放在心上,它显着提高了我的编码的清晰度。 几个月后,我记得这一点,并已回到upvote你。干杯。 – bitwit 2011-01-02 23:50:03

1

我想我已经想通了,所以我会尝试回答我自己的问题。

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

笔尖不是一个对象类,它不像NSObject那样初始化到内存中。它只是一个存档的替代方案,以编程方式加载视图,并且每次需要在视图控制器中使用它时都需要加载。

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

0

Nib文件只是一组已经被序列化的用户界面对象。当您执行[controller initWithNibName:@"file"]时,对象将从文件重建到内存中。 Interface Builder的文件所有者controller对象正在发送的消息。因此,在加载笔尖时,无论您从文件的所有者到“界面”构建器中的视图所做的任何连接都连接到controller对象。至少这可能是view财产UIViewController

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

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