警报视图对象上的EXC_BAD_ACCESS我保留,使用,然后释放

时间:2011-10-21 17:17:06

标签: objective-c ios memory-management

我知道这是一个常见的问题,所以我需要一个解释,所以我不会遇到这个问题。在我的头文件中,我定义了一个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,所以每次我准备重新分配它时,我都会释放旧的。

请帮助我理解我的误解。

3 个答案:

答案 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