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

发布于 2024-12-11 12:20:11 字数 846 浏览 0 评论 0原文

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

请帮助我理解我的误解。

I know this is a common problem, so I need an explanation so I don't keep having this problem. In my header file, I have defined a UIAlertView and retained it as shown:

@interface myController {
    UIAlertView *alert;
}

@property (nonatomic, retain) UIAlertView *alert;

In my implementation, I use and reuse this alert as follows:

@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];

I also release this in my dealloc.

So, I've heard the golden rule on memory management, but I apparently don't understand it. The golden rule says that you must never release an object that you have not either retained or obtained via alloc. You must always eventually release an object that you have either retained or obtained via alloc.

I retained it in the header file, so I eventually must release it in the dealloc. In my implementation, I perform an alloc of the alert object more than once, so each time I get ready to re-alloc it, I release the old one.

Please help me understand what I am misunderstanding.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

荒路情人 2024-12-18 12:20:11

指定了 retain@property 是这样实现的...

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

因此,通过为属性分配一个新值,该属性将处理 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];

The @property with retain specified is implemented something like this...

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

So by assigning a new value to the property, the property will handle the release of the previous value... so when you manually release it, you're over-releasing.

Also, since you have the @property set to retain, you should autorelease before assigning to the property:

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

[self.alert show];
魂归处 2024-12-18 12:20:11

您的财产保留。因此,当您设置 self.* 时,它会为您保留。类似地,当您将属性设置为 nil 或另一个对象时,它会释放旧的属性对象。

Your property retains. So when you set with self.* it retains for you. Similarly when you set the property to nil or another object it release the old property object.

孤独难免 2024-12-18 12:20:11

看来你双重保持了警惕!
self.alert 执行保留,您的对象已经保留计数为 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];

相反!

Looks like you are double-retaining your alert!
self.alert does a retain, your object has already retainCount of 1 since it's been instantiated with alloc init

Try this:

//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];

instead!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文