Alloc-init UIStoryboard中的对象

Eph*_*era 1 objective-c interface-builder ios uistoryboard

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

@property (nonatomic, strong) IBOutlet UIImageView *imageView;
Run Code Online (Sandbox Code Playgroud)

保留在自己的设备上,ViewController将很高兴地加载并在正确的框架内显示正确的图像,如Interface Builder中所确定的那样.但是,如果将以下代码添加到View Controller的viewDidLoad方法中,则会实现(显然)相同的结果.

- (void)viewDidLoad {
    _imageView = [[UIImageView alloc] init];
    //...
}
Run Code Online (Sandbox Code Playgroud)

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

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

jrt*_*ton 6

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

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

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