取消分配和删除UiButtons

时间:2011-06-05 04:11:31

标签: iphone cocoa-touch

我正在尝试使用以下命令创建一个动态创建按钮的程序:

[UIButton buttonWithType:UIButtonTypeRoundedRect]

但是当我使用这些命令时,删除我创建的按钮:

[currentButton removeFromSuperview];
[currentButton dealloc];
[currentButton release];

我收到错误。我如何从uibutton中删除和释放内存?

4 个答案:

答案 0 :(得分:2)

我很久以前就遇到过这个问题,请注意

[UIButton buttonWithType:UIButtonTypeRoundedRect]

内部已自动释放,因此在初始化时,您需要保留,如下所示:

_mybutton = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];

以后,你可以这样做:

[_mybutton release];

希望有所帮助 :)

答案 1 :(得分:0)

如果您没有分配任何实例,那么您无法从系统中取消通过UIButton获得的buttonWithType,那么您无权致电{ {1}}就此而言。

在您的情况下,您可以使用release,但不能使用removeFromSuperviewdealloc

您不能直接在对象上调用release,当您在对象上说dealloc时,系统会调用此对象。

<强>编辑:

您可以使用release initWithFrame函数创建按钮。但是,您将只获得默认情况下的按钮类型UIView,并且也不能更改按钮类型,因为它是UIButtonTypeCustom属性。因此,您可以使用一些图像来获得圆形按钮。

答案 2 :(得分:0)

在Objective-C / Cocoa框架中,您会遇到两种不同的接收对象的方法:已经为(通过构造函数)显式分配内存的方法和已经接收到内存引用的方法(通过类方法)。

FooBar *fone = [[FooBar alloc] initWithText:@"Hello, World!"];

在这个例子中,使用alloc方法通过调用显式地为对象分配内存,然后使用initWithText方法初始化内存,该方法将具有如下方法头:

- (id)initWithText:(NSString *)text;

另一方面,您还将遇到由类自动为您创建的对象。这方面的一个例子如下:

FooBar *ftwo = [FooBar fooBarWithWelcomeText];

在这个例子中,即使我们没有调用alloc来为它分配内存,也会返回一个FooBar对象。实现这样的方法有很多不同的原因,但它主要用于从使用该对象的代码中抽象出某些细节。上面的示例将具有相应的方法标题,如下所示:

+ (FooBar *)fooBarWithWelcomeText;

根据使用的方法,它会改变您与对象内存交互的方式。因此,对于第一个示例,在为对象分配内存之后,将其保留计数为1.如果您已完成使用该对象,则需要使用

明确释放它。
[fone release];

在第二个示例中,您将收到一个自动释放的对象,一旦自动释放池耗尽,该对象将被释放。如果您想保留它,则必须明确保留:

[ftwo retain];

如果您不想保留它,您可以保持原样,它将自动解除分配。您可以通过两个特征告诉方法使用自动释放:1)当您收到对象时,您将不会使用alloc; 2)方法标题旁边会有一个“+”。这意味着该方法被声明为类方法(类似于Java静态方法)。

因此,为了最终回答您的具体情况,您只需要确保将保留计数降低到1(唯一引用它的对象是自动释放池)。在您的示例中,它将按以下方式完成:

UIButton *currentButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[someView addSubView:currentButton];

// some code later
[currentButton removeFromSuperview];

您不需要发布语句,因为您从未明确保留它。当您将UIButton添加到另一个视图时,它保留了该对象,因此它将引用计数增加到2.通过从视图中删除它,将其降低到1,以便在刷新自动释放池时,将取消分配UIButton 。顺便说一句,永远不要直接调用dealloc方法。当一个对象的保留计数减少到0时,将自动调用dealloc方法。

答案 3 :(得分:-1)

你不应该直接打电话给dealloc。尝试删除dealloc行,看看它是如何工作的。