何时释放物体

时间:2011-08-12 17:15:48

标签: iphone objective-c memory-management

我相信如果我用关键字init,alloc,copy或move创建它,我必须释放一个对象。我可以用不使用这个关键字的代码创建对象,所以我想我没有必要发布它们吗?以此为例:

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button addTarget:self 
           action:@selector(aMethod:)
 forControlEvents:UIControlEventTouchDown];
[button setTitle:@"Hello" forState:UIControlStateNormal];
button.frame = CGRectMake(40.0, 200.0, 170.0, 40.0);
[self.view addSubview:button];

因为我在代码中没有使用任何这些关键字,所以我不应该发布它吗?那个什么时候被释放?我对记忆管理的东西感到困惑。

4 个答案:

答案 0 :(得分:3)

您在此处创建的唯一对象是UIButton,并且您使用了buttonWithType类方法。那就是返回你自动释放的对象,所以你不必释放它。

请记住,如果您以后需要此按钮,则需要保留该按钮并最终将其释放。因为您将此按钮添加到视图中,所以视图在此情况下会保留副本,因此您无需担心它。

答案 1 :(得分:1)

如果您正在运行XCode 4,我建议运行“分析”模式以对内存泄漏运行快速基本检查......看起来很好(您的代码)。

答案 2 :(得分:1)

您绝对正确,因为您不必明确释放任何您未通过alloc,copy,new或retain获得所有权的内容。

在这种情况下,您通过便捷方法(buttonWithType :)创建了按钮。这将返回一个自动释放的UIButton对象。在运行循环结束时刷新自动释放池时会自动释放。

这里没有什么可担心的。让运行时处理它。

答案 3 :(得分:1)

有一个NSAutoreleasePool可以为您管理内存。你是正确的alloc和copy(alloc和init通常在一起)但不移动。另一个返回保留对象的方法是以new ex为前缀的方法。 +(id)new;。每个线程都需要一个自动释放池来管理每个事件循环的内存。

按钮实现的外观示例

-(id)buttonWithType:(UIButtonType)type
{
    UIButton *button = [[[UIButton alloc] initSecretlyWithType:type] autorelease]; 
    //Customize button if needed
    return button;
}

有关详细信息,请参阅Using Autorelease Pools