我相信如果我用关键字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];
因为我在代码中没有使用任何这些关键字,所以我不应该发布它吗?那个什么时候被释放?我对记忆管理的东西感到困惑。
答案 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。