2012-07-13 4 views
0

나는이 코드를 여기에있는 다른 스레드에서 꺼냈다. 완벽하게 작동하지만 누수가있다. 나는 그것을 풀어 낼 방법을 모른다. GoToNext 할당 줄에 "autorelease"문을 추가하려고했습니다. 그것은 도움이 안됐다. 누구든지이 문제를 올바르게 처리하는 방법을 알고 있습니까?이 배정은 어떻게 해제합니까?

webView.delegate = [[GoToNext alloc] initWithTarget:self andNext:@selector(loadUpdateGraph)]; //leak 

이것은 GoToNext 코드입니다 : 당신이 alloc를 사용 GoToNext의 인스턴스를 만들 때

@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

+0

방금 ​​시도해 보니 좀비 오류가 발생하고 앱이 다운됩니다. :( – MrHappyAsthma

답변

1

는, 그 인스턴스가이 유지있다 .H

1을 계산하십시오. 앱의 어딘가에 y 이전에이 인스턴스를 공개해야합니다. 그것에 대한 유일한 참조를 잃게됩니다 (이 경우 delegate 속성은 webView입니다). delegate 속성이 UIWebView이면 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이며 다시 이런 종류의 문제에 대해 걱정할 필요가 없습니다.

+0

Ohhhh thats 내가 왜 오류가 있었는지. 그것은 여전히 ​​현재 대리인 동안 릴리스하려고했습니다. 그 대리자를 변경할 때마다 그 메서드를 사용하고 그것을 호출하고 완벽하게 작동했습니다! – MrHappyAsthma

관련 문제