非常规UIViewController用法的危险

时间:2013-10-28 20:58:31

标签: ios cocoa-touch uiviewcontroller

我正在浏览一些旧代码并尝试检测一些难以发现的错误。我遇到了UIViewController的不寻常用法,其中控制器被分配,存储在属性中,并且其视图被添加为子视图而不是呈现整个控制器。

让我首先说我知道这有点hacky和异常。那就是说,以下实施的危险是什么?这可能导致任何意想不到的副作用吗?如果MyOtherViewController卸载其视图并由于在某个时刻收到内存警告而重新创建它会导致任何奇怪的行为,该怎么办?

@interface MyViewController()
@property (nonatomic, strong) MyOtherViewController *otherVC;
@end

@implementation MyViewController

- (void)viewDidLoad
{
    self.otherVC = [[MyOtherViewController alloc] init];
    [self.view addSubview:self.otherVC.view];
}

@end

3 个答案:

答案 0 :(得分:2)

您正在做的是创建自定义视图控制器容器。这不是一件坏事,但你没有按照你应该的方式去做。 UIViewController的类引用中有一个section,它解释了如何完成你想要做的事情。

答案 1 :(得分:1)

以编程方式查看显示视图控制器内容

https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/UsingViewControllersinYourApplication/UsingViewControllersinYourApplication.html#//apple_ref/doc/uid/TP40007457-CH6-SW8

请注意:重要事项:切勿直接将视图控制器的视图安装到视图层次结构中。

答案 2 :(得分:0)

我刚刚在一个项目中找到了令人讨厌的BAD EXEC崩溃事件(请参阅下面讨厌的bug)。

我可以说使用UIViewController非常糟糕,因为:

  • 您必须确保未取消分配控制器。该视图不会因为它在视图层次结构中具有超级视图,但控制器没有保留它的对象。如果它作为rootController被添加到窗口,到选项卡控制器,导航控制器或由另一个控制器(正常使用)提供它就可以了。

  • 除了v​​iewDidLoad之外,它不会收到您希望被调用的方向更改和消息。

  • 讨厌的错误。例如,在iOS 5中,如果在解除模态控制器之前未对此控制器进行解除分配,则会发生BAD EXEC崩溃,这会让您发疯。似乎SDK中的动画方法期望您的视图控制器在解除模式动画期间出现。