Alloc-init UIStoryboard中的对象

时间:2012-11-29 08:10:41

标签: objective-c ios interface-builder uistoryboard

考虑一种情况,即故事板文件中的对象链接到IBOutlet,如下所示。

@property (nonatomic, strong) IBOutlet UIImageView *imageView;

离开它自己的设备,ViewController将很乐意加载并在正确的框架内显示正确的图像,如Interface Builder中所确定的。 但是,如果将以下代码添加到View Controller的viewDidLoad方法中,则会获得(显然)相同的结果。

- (void)viewDidLoad {
    _imageView = [[UIImageView alloc] init];
    //...
}

这是否意味着IBOutlets的程序化alloc-initing完全是可选的?或者这条线的增加是否会产生略微不同的结果?

我问,因为我总是在实现中添加alloc-init,然后在我的最新项目中我忘记了它,令我惊讶的是,它仍然完全符合预期。

4 个答案:

答案 0 :(得分:6)

故事板或xib文件是其中包含的对象的序列化。加载故事板后,将实例化所有对象(使用initWithCoder:,因为我们正在对它们进行反序列化)。这与allo / init完成相同的工作,添加了设置xib中定义的对象的所有属性。

xib包含有关图像视图的足够信息,可以完全创建它。如果你然后分配/初始化一个新的图像视图并将其分配给用于出口的变量,你只需要替换从故事板创建的对象,这是毫无意义的,因为你的插座现在指向什么都没有屏幕。

总之 - 每个插座的alloc / init不是可选,它是错误的

答案 1 :(得分:2)

当你向NIB添加一个对象时,对象的生命周期完全由UIViewController(或子类)控制,并且ARC引用它默认为弱,因为ViewController将正确处理对象的alloc,init和release在加载视图时,那么你正在做什么将它的ARC引用更改为strong,所以在引用它之后对象不会立即释放,它会像你尝试的那样工作,但理论上你将以创建的对象结束Interface Builder和你刚刚在那里创建的那个,如果你没有设置任何框架或添加到任何视图而你没有在对象后面进行任何引用ARC会释放它,你将以图像视图结束你在Inteface Builder中创建,但是在你刚刚创建的新[[UIImageView alloc] init]引用_imageView时没有任何指针。

答案 2 :(得分:1)

如果您使用的是Xcode 4.4,它会自动为您合成属性。你可能正在经历这种情况? Ref

答案 3 :(得分:0)

故事板中对象的Alloc / init基本上是一个错误。

加载视图后,将自动初始化并加载所有子视图。如果再次初始化它,将会创建另一个实例,并且该对象的上一个实例将不被使用。

实际上,为了使最近初始化的对象实例正常工作,您必须将实例(在您的UIImageView实例中)添加为子视图。