我试图让动态创建使用命令按钮的程序:
[UIButton buttonWithType:UIButtonTypeRoundedRect]
但是,当我使用这些命令删除我创建按钮:
[currentButton removeFromSuperview];
[currentButton dealloc];
[currentButton release];
我收到一个错误。 我怎么会去从一个UIButton去除和回收内存?
我试图让动态创建使用命令按钮的程序:
[UIButton buttonWithType:UIButtonTypeRoundedRect]
但是,当我使用这些命令删除我创建按钮:
[currentButton removeFromSuperview];
[currentButton dealloc];
[currentButton release];
我收到一个错误。 我怎么会去从一个UIButton去除和回收内存?
在目标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方法将被自动调用。
我得到了这个问题很久以前,请注意
[UIButton buttonWithType:UIButtonTypeRoundedRect]
已经自动释放里面,所以在你初始化你需要做的保留,就像这样:
_mybutton = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
后来点,你可以这样做:
[_mybutton release];
希望帮助:)
你无法不dealloced的UIButton
你打通buttonWithType
从系统,如果你不alloced任何实例,那么你无权调用release
这一点。
你的情况,你可以使用removeFromSuperview
但也不dealloc
或release
。
你不能打电话dealloc
时,你说直接对象,这是由系统调用release
的对象。
编辑:
您可以使用您创建按钮initWithFrame
功能UIView
。 但是,将只得到了按钮式UIButtonTypeCustom
这是在默认情况下,还因为它不能改变不了按钮式readonly
属性。 所以,你会用你的一些图像得到的圆形按钮。
你不应该直接调用的dealloc。 尝试取出的dealloc线,看看它是如何工作。