重新分配和删除UiButtons(Deallocating and removing UiButto

2019-09-29 02:46发布

我试图让动态创建使用命令按钮的程序:

[UIButton buttonWithType:UIButtonTypeRoundedRect]

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

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

我收到一个错误。 我怎么会去从一个UIButton去除和回收内存?

Answer 1:

在目标C /可可框架,会遇到两种不同的方式来接收对象:您已显式地分配存储器,用于(通过一个构造)一和那些已接收到的存储器引用(通过一个类方法)。

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

在这个例子中,内存是明确地被分配由您的通话对象,使用方法页头,然后它被使用,将有一个这样的方法头的initWithText方法的数据初始化:

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

在另一方面,你也会遇到由类自动创建的对象。 这方面的一个例子是如下:

FooBar *ftwo = [FooBar fooBarWithWelcomeText];

在这个例子中,FooBar的对象被返回,即使我们不呼吁的alloc为它分配内存。 有实现这样的方法很多不同的原因,但它主要是做从代码抽象一些细节正在使用的对象。 以上的例子有这样的对应方法的标题:

+ (FooBar *)fooBarWithWelcomeText;

根据使用哪种方法,它改变了你如何与对象的内存交互。 因此,对于第一个例子,为对象分配内存后,您会收到回为1。保留计数如果您正在使用这个对象,你需要显式地释放它

[fone release];

在第二示例中,正在接收的自动释放物体,一旦autoreleasepool被排出,这将被释放。 如果你想保持它,你必须明确地保留有:

[ftwo retain];

如果你不希望把它保留下来,你可以把它作为是,它会自动释放。 你可以告诉一个方法,通过两个特点使用自动释放:1)当您收到的对象,你也就无法使用页头; 和2)将有一个“+”旁边的方法航向。 这意味着,该方法被声明为一个类的方法(类似于Java静态方法)。

所以,最终回答您的具体情况,你只需要确保保留计数下降到1(有对它的引用的唯一对象是自动释放池)。 在你的榜样,它会做这样的:

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

// some code later
[currentButton removeFromSuperview];

你不需要发布声明,因为你从来没有明确地保留它。 当添加的UIButton到另一个视图,它保留该对象,以便它递增引用计数为2。通过从视图中去除它,它被降低回落到1,使得当自动释放池冲洗,您的UIButton将解除分配。 顺便说一下,不要直接调用dealloc方法。 当一个对象的保留计数递减到0时,dealloc方法将被自动调用。



Answer 2:

我得到了这个问题很久以前,请注意

[UIButton buttonWithType:UIButtonTypeRoundedRect]

已经自动释放里面,所以在你初始化你需要做的保留,就像这样:

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

后来点,你可以这样做:

[_mybutton release];

希望帮助:)



Answer 3:

你无法不dealloced的UIButton你打通buttonWithType从系统,如果你不alloced任何实例,那么你无权调用release这一点。

你的情况,你可以使用removeFromSuperview但也不deallocrelease

你不能打电话dealloc时,你说直接对象,这是由系统调用release的对象。

编辑:

您可以使用您创建按钮initWithFrame功能UIView 。 但是,将只得到了按钮式UIButtonTypeCustom这是在默认情况下,还因为它不能改变不了按钮式readonly属性。 所以,你会用你的一些图像得到的圆形按钮。



Answer 4:

你不应该直接调用的dealloc。 尝试取出的dealloc线,看看它是如何工作。



文章来源: Deallocating and removing UiButtons