Ios viewcontroller释放会导致崩溃或奇怪现象

Ios viewcontroller释放会导致崩溃或奇怪现象,ios,uiviewcontroller,release,addsubview,Ios,Uiviewcontroller,Release,Addsubview,我有一个非常简单的ViewController,它包含以下内容: @interface ServingsView : UIViewController @property (retain, nonatomic) IBOutlet UILabel *labelTitle; @property (retain, nonatomic) IBOutlet UILabel *labelContent; @property (retain, nonatomic) IBOutlet UIButton *but

我有一个非常简单的ViewController,它包含以下内容:

@interface ServingsView : UIViewController
@property (retain, nonatomic) IBOutlet UILabel *labelTitle;
@property (retain, nonatomic) IBOutlet UILabel *labelContent;
@property (retain, nonatomic) IBOutlet UIButton *buttonSelect;
我没有向该控制器的m文件添加任何代码

现在,我正在创建此viewcontroller并将其视图添加到滚动视图:

 for (NSSubArray * Choice in currentItem.ItemsArray)
    {
        stView * ChoiceView=[[stView alloc]initWithNibName:@"stView" bundle:nil];
        ChoiceView.view.tag=1515;
        [mScrollView addSubview:ChoiceView.view];
        ChoiceView.view.frame=CGRectMake(0, [self getMinimumHeight]+h*ChoiceView.view.frame.size.height , 320, ChoiceView.view.frame.size.height);
        ChoiceView.labelTitle.text=Choice.ArrayName;

        [ChoiceView.buttonSelect addTarget:self action:@selector(onSubservingItemClicked:) forControlEvents:UIControlEventTouchUpInside];

        ChoiceView.buttonSelect.tag=h;
        h++;
        increaseHeight+=ChoiceView.view.frame.size.height;
        // here is the problem:
        [ChoiceView release];
    }
现在,我不会在任何地方使用ChoiceView。发生的事情是,按钮甚至没有显示,视图也没有任何响应。当使用其环境中的视图进行滚动时,我会遇到不同类型的异常。有时是CALayer异常,有时是stView异常。当我移除发布线时,一切都正常


我甚至创建了一个测试项目,但它没有在那里发生,所以我在这里遗漏了一些东西

不要做类似于
[mScrollView addSubview:ChoiceView.view]的事情。如果您查看查看控制器包含的Apple视频,您会发现他们将其描述为不一致的视图层次结构:


按照定义将视图作为滚动视图的视图层次结构的一部分,或者创建一个使用提供的父/子方法的容器视图控制器。

好的,这是一个非常奇怪的答案! 在多次测试和未能引发此错误的模拟应用程序之后,我将出现故障的控制器添加到另一个应用程序中。得到了同样的结果! 所以,我完全删除了它,并创建了一个新的。。。现在它开始工作了


苹果围棋

谢谢你的回复!这是一个4.3应用程序,所以我不能使用那个API。而且,我从来没有像上面提到的那样获得UIViewControllerHierarchyInconsistency,这段代码正在处理我为检查它而做的示例项目。。。此外,我看不到任何其他方法可以将子视图添加到scrollview,因为它们是动态创建的,我不知道会有多少。如果您回到4.3,您可能需要创建一个包含视图所有者的子控制器数组,从而创建自己的容器控制器等价物。另一种相当安全的方法是设计不需要控制器的自定义视图并直接加载它们。(注意:在不触发导致特定错误的事件的情况下,可能存在不一致的层次结构。)好的,所以我创建了一个数组来保存子视图控制器,现在在从数组中删除它们时,我得到了一个一致的错误:[CALayer release]:消息发送到解除分配的实例。有一点进展。。。。