我知道这是一个常见的问题,所以我需要一个解释,所以我不会遇到这个问题。在我的头文件中,我定义了一个UIAlertView并保留它,如下所示:
@interface myController {
UIAlertView *alert;
}
@property (nonatomic, retain) UIAlertView *alert;
在我的实现中,我使用并重用此警报如下:
@synthesize alert;
...
if (self.alert != nil) {
[self.alert release];
}
self.alert = [[UIAlertView alloc] initWithTitle:title
message:message
delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles: @"Ok To Send", nil];
[self.alert show];
我也在我的dealloc中发布了这个。
所以,我听说过关于内存管理的黄金法则,但我显然不理解它。黄金法则规定,您必须永远不要释放您未通过alloc保留或获得的对象。您必须始终最终释放您通过alloc保留或获得的对象。
我将它保留在头文件中,所以我最终必须在dealloc中释放它。在我的实现中,我不止一次执行一个alert对象的alloc,所以每次我准备重新分配它时,我都会释放旧的。
请帮助我理解我的误解。
答案 0 :(得分:1)
您的财产保留。因此,当你设置自我。*它保留给你。类似地,当您将属性设置为nil或其他对象时,它会释放旧的属性对象。
答案 1 :(得分:1)
看起来你是双重保留你的警报! self.alert执行retain,你的对象已经keepCount为1,因为它已经用alloc init实例化了
试试这个:
//if (self.alert != nil) {
// [self.alert release];
//}
self.alert = nil;
alert = [[UIAlertView alloc] initWithTitle:title
message:message
delegate:self
cancelButtonTitle:@"Cancel" otherButtonTitles: @"Ok To Send", nil];
[self.alert show];
,而不是!
答案 2 :(得分:1)
指定@property
的{{1}}实现了类似的内容......
retain
因此,通过为属性分配新值,该属性将处理前一个值的-(void)setAlert:(UIAlertView*)alert
{
if (self->alert != alert)
{
[self->alert release];
self->alert = [alert retain];
}
}
...因此,当您手动release
它时,您将过度释放。
此外,由于您将release
设置为@property
,因此在分配给该媒体资源之前,您应retain
:
autorelease