我正在尝试使用以下命令创建一个动态创建按钮的程序:
[UIButton buttonWithType:UIButtonTypeRoundedRect]
但是当我使用这些命令时,删除我创建的按钮:
[currentButton removeFromSuperview];
[currentButton dealloc];
[currentButton release];
我收到错误。我如何从uibutton中删除和释放内存?
答案 0 :(得分:2)
我很久以前就遇到过这个问题,请注意
[UIButton buttonWithType:UIButtonTypeRoundedRect]
内部已自动释放,因此在初始化时,您需要保留,如下所示:
_mybutton = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
以后,你可以这样做:
[_mybutton release];
希望有所帮助 :)
答案 1 :(得分:0)
如果您没有分配任何实例,那么您无法从系统中取消通过UIButton
获得的buttonWithType
,那么您无权致电{ {1}}就此而言。
在您的情况下,您可以使用release
,但不能使用removeFromSuperview
或dealloc
。
您不能直接在对象上调用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行,看看它是如何工作的。