如何释放此分配?
我从这里的另一个线程得到了这段代码,它完美的工作,但它泄漏,我不知道如何释放它。我曾尝试将“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
当您使用alloc
一个的GoToNext
实例,该实例有保留计数为1.在您的应用程序的某处,您必须在y之前释放此实例你失去了你唯一的参考(在这种情况下是delegate
财产webView
)。 UIWebView
的delegate
属性使用assign
语义,因此将该实例GoToNext
分配给该属性不会保留它。这意味着你不能release
或autorelease
它虽然它仍然是代理webView
或webView.delegate
将指向释放内存。
如果你确定你只在包含该代码的类的生命周期设置webView.delegate
一次,你可以通过只是把[webView.delegate release]
在该类的dealloc
方法。如果你不止一次设置它,你可以尝试创建一个方法,如:
-(void)setWebViewDelegate:(id)delegate {
if (webView.delegate) {
[webView.delegate release];
}
webView.delegate = delegate;
}
,并使用该方法来设置webView
的代表。还有其他方法可以处理这种情况,但我认为这种方法可能需要对代码进行最少的更改。
当然,在我看来,最好的解决方案就是convert the application to ARC,而且再也不用担心这种事情。
Ohhhh这就是为什么我有错误,我试图释放它,而它仍然是当前的代表。我用这种方法,并调用它,每次我改变委托,它的工作完美! – MrHappyAsthma 2012-07-13 23:10:34
对于每个init,你不需要自己释放它吗?所以不应该有'self = [[super init] autorelease];'?我只是自己进入Xcode,所以我可能会错的! – romo 2012-07-13 20:59:04
我刚刚尝试过,它会导致僵尸错误,并崩溃应用程序。 :( – MrHappyAsthma 2012-07-13 21:56:41