2012-07-13 54 views
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 
+0

对于每个init,你不需要自己释放它吗?所以不应该有'self = [[super init] autorelease];'?我只是自己进入Xcode,所以我可能会错的! – romo 2012-07-13 20:59:04

+0

我刚刚尝试过,它会导致僵尸错误,并崩溃应用程序。 :( – MrHappyAsthma 2012-07-13 21:56:41

回答

1

当您使用alloc一个的GoToNext实例,该实例有保留计数为1.在您的应用程序的某处,您必须在y之前释放此实例你失去了你唯一的参考(在这种情况下是delegate财产webView)。 UIWebViewdelegate属性使用assign语义,因此将该实例GoToNext分配给该属性不会保留它。这意味着你不能releaseautorelease它虽然它仍然是代理webViewwebView.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,而且再也不用担心这种事情。

+0

Ohhhh这就是为什么我有错误,我试图释放它,而它仍然是当前的代表。我用这种方法,并调用它,每次我改变委托,它的工作完美! – MrHappyAsthma 2012-07-13 23:10:34