UIView是否会在Cocoa Touch中发布其子视图?

时间:2010-12-09 20:43:19

标签: objective-c cocoa cocoa-touch memory-management uiview

如果我在运行时创建一个UIControl并将其添加到视图中(通过addSubview :),视图是否会释放它,或者我应该这样做?

这是一个示例代码:

-(IBAction) cloneMe: (id) sender{

    if (!currentY) {
        currentY = [sender frame].origin.y;
    }

    UIButton *clone = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    CGRect cloneFrame = [sender frame];
    cloneFrame.origin.y += currentY + cloneFrame.size.height + 30;
    clone.frame = cloneFrame;
    [clone setTitle:@"I'm a clone" forState:UIControlStateNormal];

    [[sender superview] addSubview:clone];

    currentY = cloneFrame.origin.y + cloneFrame.size.height;


}

2 个答案:

答案 0 :(得分:7)

[UIButton buttonWithType:UIButtonTypeRoundedRect]为您提供已自动释放的对象。 这意味着你不“拥有”该对象,因此你没有责任释放它。

如果您保留它,那么您将明确表示您希望自己保留此对象,这意味着您将负责释放它。

UIView会保留其子视图,因此发布它们是UIView的责任。 UIView将在其自身被取消分配时,或者从超级视图中删除子视图时释放它的子视图。

基本上,如果您没有alloc/initnewcopyretain一个对象,那么它不是您的对象,您不负责释放它。您不必担心它,无论拥有该对象的对象(在您的情况下UIView)将在完成它时释放它。

答案 1 :(得分:1)

当你addSubview:接收者保留参数时,当你通过其中一种方法删除它时释放它。