我保留、使用并释放警报视图对象上的EXC_BAD_ACCESS



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

请告诉我我误解了什么

指定retain@property是这样实现的…

-(void)setAlert:(UIAlertView*)alert
{
        if (self->alert != alert)
        {
                [self->alert release];
                self->alert = [alert retain];
        }
}

因此,通过为属性分配一个新值,该属性将处理前一个值的release…所以当你手动release时,你会过度释放。

同样,既然您已经将@property设置为retain,那么您应该在分配属性之前设置autorelease:

self.alert = [[[UIAlertView alloc] initWithTitle:title 
                                         message:message
                                        delegate:self cancelButtonTitle:@"Cancel"  
                               otherButtonTitles: @"Ok To Send", nil] autorelease];
[self.alert show];

您的属性保留。当你用self集合时。它为你保留。同样,当你将属性设置为nil或其他对象时,它会释放旧的属性对象。

看起来你是双重保留你的警报!自我。alert做一个retain,你的对象已经retainCount为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];

相反!

相关内容

最新更新