0

我在这里的另一个线程上得到了这段代码,它运行良好,但它泄漏了,我不知道如何释放它。我尝试将“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
4

1 回答 1

1

当您创建GoToNextusing的实例时alloc,该实例的保留计数为 1。在您的应用程序中的某处,您必须在丢失对它的唯一引用之前释放此实例(在本例中是 的delegate属性webView)。a的delegate属性UIWebView使用assign语义,因此将您的实例分配GoToNext给该属性不会保留它。这意味着当它仍然是或将指向已释放内存的代表时,您不能release或它。autoreleasewebViewwebView.delegate

如果您确定只webView.delegate在包含此代码的类的生命周期中设置一次,则只需放入该类[webView.delegate release]的方法即可。dealloc如果您不止一次设置它,您可以尝试创建如下方法:

-(void)setWebViewDelegate:(id)delegate {
    if (webView.delegate) {
        [webView.delegate release];
    }
    webView.delegate = delegate;
}

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

当然,在我看来,最好的解决方案是将应用程序转换为 ARC,再也不用担心这种事情了。

于 2012-07-13T22:42:32.340 回答