2012-07-13 68 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