【问题标题】:ios multiple views with a scroll view deallocated instanceios 多个视图与滚动视图释放实例
【发布时间】:2012-06-27 09:53:26
【问题描述】:

我对包含多个视图的滚动视图有疑问。我认为问题在于正在发布子视图。我在子视图中有按钮,当我单击按钮时出现此错误,[GraphDisplayViewController performSelector:withObject:withObject:]:

消息发送到解除分配的实例

。如果只有一个子视图,那么我可以只使用一个属性,这可行,但由于子视图的数量不同(一个或多个),它不起作用,我不知道如何解决这个问题。

我目前在开始时一次加载所有视图。我一次只加载一个子视图并将属性分配给该视图,但我不确定这是否可行。

我的布局如下,一个父视图(DetailViewController)包含一个滚动视图,我在滚动视图中添加视图(GraphDisplayViewController),子视图每个加载一个视图(GraphView)。

任何帮助或建议将不胜感激。如果您需要更多详细信息,请告诉我。感谢您的宝贵时间。

我如何添加子视图的代码示例,

DetailViewController

- (void)loadScrollViewWithPage:(int)page
{
if (page < 0) return;
if (page >= pageControl.numberOfPages) return;

subView = [viewControllers objectAtIndex:page];   
NSString *description;
NSString *packsize;
if ((NSNull *)subView == [NSNull null]) 
{
    subView = [[GraphDisplayViewController alloc] initWithNibName:@"GraphDisplayViewController" bundle:nil];
    [viewControllers replaceObjectAtIndex:page withObject:subView];
    subView = [[GraphDisplayViewController alloc] init];
    subView.molecule = moleculeName;
    subView.description = description;    
    subView.dataArray = moleculePrices;

}
else
{
    return;
}

// add the controller's view to the scroll view
if (nil == subView.view.superview) 
{
    CGRect frame = scrollView.frame;
    frame.origin.x = frame.size.width * page;
    frame.origin.y = 0;
    subView.view.frame = frame;
    [scrollView addSubview:subView.view];
} 
}

更新 代码有错误,测试看看能不能解决问题

subView = [[GraphDisplayViewController alloc] initWithNibName:@"GraphDisplayViewController" bundle:nil];
[viewControllers replaceObjectAtIndex:page withObject:subView];
subView = [[GraphDisplayViewController alloc] init]; <- Mistake

【问题讨论】:

  • subview 是如何声明的? (如果是属性,请使用self.subView 引用它。)

标签: ios memory-management


【解决方案1】:

您没有保留分配给subView 变量的GraphDisplayViewController。因此,您有时会失去它。

如我们所见,您正在获取subView 对象,例如subView = [viewControllers objectAtIndex:page]; 那么你也应该将它存储在viewControllers 中(虽然我不确定你已经实现了什么逻辑,但是在你的代码中为每个分配的subView 这必须执行:[viewControllers replaceObjectAtIndex:page withObject:subView]; 并且你需要确保viewControllers 变量也保留一切顺利工作。)

数组,以便可以保留它以避免您面临的崩溃。
我希望这对你有用..祝你好运

【讨论】:

  • 嗨,谢谢你的回复,你的意思是我应该使用一个属性,例如@property (nonatomic, 保留) GraphDisplayViewController *subView;如果是这样,我已经这样做了,我更新了我的问题,我想我发现了错误,它现在似乎可以工作,但仍在测试它。
  • 虽然您可能已经创建了subView 作为保留属性,但实际上它并没有被保留,因为您在分配时没有使用self.subView
  • 哦,好吧,将 self.property 用于保留属性总是更好吗?我让我的应用程序正常工作,我认为这是我在帖子中更新的错误。不过很奇怪,当我只使用“subView”时它就可以工作。
【解决方案2】:

我的代码中有一个简单的错误,我将视图初始化了两次。

subView = [[GraphDisplayViewController alloc] initWithNibName:@"GraphDisplayViewController" bundle:nil];
subView = [[GraphDisplayViewController alloc] init]; <- Mistake

【讨论】:

    猜你喜欢
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 2023-03-13
    • 2011-11-18
    相关资源
    最近更新 更多