我从这里得到了另一个线程的代码,它运行得很好,但它泄漏了,我不知道如何释放它。我尝试将“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
答案 0 :(得分:1)
使用GoToNext
创建alloc
的实例时,该实例的保留计数为1.在应用程序的某个位置,您必须在丢失对该实例的唯一引用之前释放此实例(在这种情况是delegate
的{{1}}属性。 webView
的{{1}}属性使用delegate
语义,因此将UIWebView
的实例分配给该属性不会保留它。这意味着,当assign
或GoToNext
的代表仍然指向已取消分配的内存时,您无法release
或autorelease
。
如果您确定在包含此代码的类的生命周期中只设置了webView
一次,那么只需将webView.delegate
放入webView.delegate
方法即可。那个班。如果您多次设置它,可以尝试创建一个方法,如:
[webView.delegate release]
使用该方法设置dealloc
的委托。还有其他方法可以处理这种情况,但我认为这种方法可能需要对代码进行最少的更改。
当然,在我看来,最好的解决方案就是convert the application to ARC而且再也不用担心这种事了。