2012-08-05 70 views
0

我有一个非常简单的ViewController包含以下内容:视图 - 控制释放导致崩溃或奇怪的现象

@interface ServingsView : UIViewController 
@property (retain, nonatomic) IBOutlet UILabel *labelTitle; 
@property (retain, nonatomic) IBOutlet UILabel *labelContent; 
@property (retain, nonatomic) IBOutlet UIButton *buttonSelect; 

我没有添加代码到该控制器的M档。现在

,我创建这个视图控制器,并添加其视图滚动视图:

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异常。当我删除发行版时,一切正常。

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

回答

0

好的,这是非常奇怪的答案! 经过多次测试以及未能引发此错误的模拟应用程序之后,我将错误的控制器添加到其他应用程序。得到了相同的结果! 所以,我已经完全删除它并创建一个新的...现在它的工作。

苹果 - 去图...

0

不要做像[mScrollView addSubview:ChoiceView.view];这样的事情。如果您查看视图控制器遏制上的Apple视频,您会看到它们将其描述为不一致的视图层次结构:https://developer.apple.com/videos/wwdc/2011/?id=102

可以使视图成为定义的滚动视图的视图层次结构的一部分,也可以创建一个使用提供的父/子方法的容器视图控制器。

+0

TY为您的回应! 这是一个4.3应用程序,所以我不能使用该API。 另外,我从来没有得到UIViewControllerHierarchyInconsistency因为它提到有这个代码工作的样本项目,我没有检查它... 另外,我没有看到任何其他的方式来子视图添加到滚动视图,因为它们是动态创建,我不知道会有多少人。 – donald 2012-08-06 07:50:32

+0

如果您回到4.3,您可能需要通过创建一个包含视图所有者的子控制器数组来创建自己的等效容器控制器。另一种相当安全的方法是设计不需要控制器并直接加载它们的自定义视图。 (注意:它**是**可能有不一致的层次结构,而不会触发发生该特定错误的事件。) – 2012-08-06 12:02:43

+0

好的,所以我创建了一个数组来保存子视图控制器,现在我得到一致的将它们从数组中移除时出错:[CALayer release]:发送到释放实例的消息。那里有一点进展.... – donald 2012-08-06 14:07:17