iPhone:[subview release]从显示中删除我的子视图

时间:2010-05-19 08:51:47

标签: iphone objective-c memory-management subview

我有这两段代码。第一个完美无缺:

UIView *tmp = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 60.0f, 296.0f, 44.0f)];
[self.dynamicView addSubview:tmp];
[tmp release];

第二个几乎相同,但视图没有出现。

CommentBox *commentBox = [[CommentBox alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 296.0f, 44.0f)]; 
[self.dynamicView addSubview:commentBox];
[commentBox release];   // Why does this remove the view?

如果我删除了[commentBox release]该视图会出乎意料地出现。但我认为这两个代码片段没有区别。

CommentBox的init如下所示:

- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
        // Load the nib:
        NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"CommentBox" owner:self options:nil];
        self = [nibObjects objectAtIndex:0];

    }
    return self;
}

2 个答案:

答案 0 :(得分:3)

在考虑了格雷厄姆的回答后,我提出了以下解决方案:

  1. 我在我的主要UIView中的Interface Builder中拖动一个新的UIView( - >让我们称之为子UIView)
  2. 我给这个子UIView正确的大小(因为我不能调整主UIView的大小,总是320x460)
  3. 我将此子UIView中的所有其他元素拖动(以便所有元素都附加到我的子UIView)
  4. 我给我的子UIView一个标签号(Interface Builder - > View Attributes),例如“300”
  5. 在代码中,我现在在-initWithFrame:

    中执行以下操作

    NSArray * nibObjects = [[NSBundle mainBundle] loadNibNamed:@“CommentBox”owner:self options:nil]; UIView * subView = [[nibObjects objectAtIndex:0] viewWithTag:300]; [self addSubview:subView];

  6. 希望有所帮助。


    <强>更新

    我还有另一个想法。您也可以在IBOutlet UIView *viewHolder类中创建CommentBox而不是标记号,而在IB中设置出口。然后在initWithFrame:我执行以下操作:

    [[NSBundle mainBundle] loadNibNamed:@"CommentBox" owner:self options:nil];
    [self addSubview:self.viewHolder];
    

答案 1 :(得分:2)

你在-initWithFrame:做了一些奇怪的事情。我不是100%确定它会导致你报告的问题,但我很确定它是:

  • 错;和
  • 导致内存泄漏。

我不认为用-init…方法中的nib替换一个视图对象是一个好主意。从控制器类加载nib,或让初始化程序从nib加载对象的子视图而不替换self