如何发布此分配?

时间:2012-07-13 19:04:44

标签: xcode memory-leaks delegates

我从这里得到了另一个线程的代码,它运行得很好,但它泄漏了,我不知道如何释放它。我尝试将“autorelease”语句添加到GoToNext alloc行。它没有帮助。有谁知道如何正确处理这个?

webView.delegate = [[GoToNext alloc] initWithTarget:self andNext:@selector(loadUpdateGraph)]; //leak

这是GoToNext代码:

·H

    @interface GoToNext : NSObject <UIWebViewDelegate> {
    id __weak target;
    SEL next;
}
-(id)initWithTarget:(id)target andNext:(SEL)next;
-(void)webViewDidFinishLoad:(UIWebView *)webView;
@end

的.m

#import "GoToNext.h"


@implementation GoToNext
-(id)initWithTarget:(id)_target andNext:(SEL)_next {
    self = [super init];
    if (self) {
        target = _target;
        next = _next;
    }
    return self;
}
-(void)webViewDidFinishLoad:(UIWebView *)webView {
    [target performSelector:next];
}
@end

1 个答案:

答案 0 :(得分:1)

使用GoToNext创建alloc的实例时,该实例的保留计数为1.在应用程序的某个位置,您必须在丢失对该实例的唯一引用之前释放此实例(在这种情况是delegate的{​​{1}}属性。 webView的{​​{1}}属性使用delegate语义,因此将UIWebView的实例分配给该属性不会保留它。这意味着,当assignGoToNext的代表仍然指向已取消分配的内存时,您无法releaseautorelease

如果您确定在包含此代码的类的生命周期中只设置了webView一次,那么只需将webView.delegate放入webView.delegate方法即可。那个班。如果您多次设置它,可以尝试创建一个方法,如:

[webView.delegate release]

使用该方法设置dealloc的委托。还有其他方法可以处理这种情况,但我认为这种方法可能需要对代码进行最少的更改。

当然,在我看来,最好的解决方案就是convert the application to ARC而且再也不用担心这种事了。