1

考虑在情节提要文件中有一个对象链接到 的情况IBOutlet,如下所示。

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

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

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

这是否意味着程序化的分配初始化IBOutlets是完全可选的?还是添加这条线会产生稍微不同的结果?

我之所以问是因为我一直在实现中添加 alloc-init,然后在我最新的项目中我忘记了它,令我惊讶的是,它仍然按预期工作。

4

4 回答 4

6

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

xib 包含有关您的图像视图的足够信息以完全创建它。如果您随后分配/初始化一个新的图像视图并将其分配给用于出口的变量,那么您只是替换了从情节提要创建的对象,这是毫无意义的,因为您的出口现在没有指向屏幕。

总之- alloc/init 每个出口都不是可选的,这是错误的。

于 2012-11-29T08:21:58.907 回答
2

当您将对象添加到 NIB 时,对象的生命周期完全由 UIViewController(或子类)和 ARC 引用控制,默认情况下它很弱,因为 ViewController 将在加载时正确处理对象的分配、初始化和释放视图,所以您在那里所做的是将 ARC 引用更改为强,因此对象不会在您引用它后立即释放,它会按照您的尝试工作,但理论上您将以在 Interface Builder 中创建的对象结束,并且您刚刚在其中创建的那个,如果您没有设置任何框架或添加到任何视图并且您没有在对象 ARC 后面进行任何引用,则会释放它,您将以您创建的图像视图结束界面生成器,但是当您将 _imageView 引用到您刚刚创建的新 [[UIImageView alloc] init] 时,没有任何指向它的指针。

于 2012-11-29T08:28:20.103 回答
1

如果您使用的是 Xcode 4.4,它将自动为您合成属性。这可能是你正在经历的?参考

于 2012-11-29T08:19:49.733 回答
0

故事板中对象的分配/初始化基本上是一个错误。

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

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

于 2012-11-29T08:58:53.400 回答