2010-12-20 5 views
2

MBProgressHUB를 사용하고 있는데 코드가 유사하므로 here입니다. 내 코드에 대한MBProgressHUD를 사용하여 메모리 누수가 발생했습니다.

어떤 것들은 :

  • 코드 내 응용 프로그램 위임에는
  • 다른 클래스의 숫자는 내가
  • 내가 비동기있는 NSURLConnection로 사용하고
  • 호출 아니 선언 : @property (비 원자, 유지) MBProgressHUD * HUD;
  • 내가 할 아니요 : @ 합성 HUD;
  • (그리고 물론 내의 dealloc에 ​​공개하지 않습니다)

다음과 같이 내가 그것을 사용

- (void)setSearchingMode:(BOOL)isSearching { 
    // when network action, toggle network indicator and activity indicator 
    if (isSearching) { 
     [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 

     UIWindow *theWindow = [UIApplication sharedApplication].keyWindow; 
     HUD = [[MBProgressHUD alloc] initWithWindow:theWindow]; 
     [theWindow addSubview:HUD]; 

     //HUD.labelText = @"Connecting"; 
     [HUD show:YES]; 
    } else { 
     [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 

     [HUD hide:YES]; 
     [HUD removeFromSuperview]; 
     [HUD release]; 
    } 
} 

- (void)setSearchingText:(NSString *)whatToSay { 
    HUD.labelText = whatToSay; 
} 

나는 코드가 어딘가에 메모리 관리 문제를 일으키는 것을 상당히 확신합니다. 내 충돌 로그에서 내가 얻을 :

예외 유형 : EXC_BAD_ACCESS (SIGBUS)
예외 코드 : 0x0000000c에서 KERN_PROTECTION_FAILURE

0 libobjc.A.dylib 0x000027d8 objc_msgSend + 16
1 내 0x00003120 - [ MyAppDelegate setSearchingMode : (MyAppDelegate.m : 363)
2 내 0x00003458 - [MyAppDelegate connectionDidFinishLoading : (MyAppDelegate.m : 341)
3 재단 0x00032896 - [있는 NSURLConnection (NSURLConnectionReallyInternal) sendDidFinishLoading] + 62

[self setSearchingMode:NO]; 

나는 "HUD에 대한 속성 접근을함으로써 그것을하려고했으나 라인 주위를 얻을 수 없습니다 [MBProgressHUD의 ALLOC : + 72 내가 전화 connectionDidFinishLoading에

4 재단 0x00032818 _NSURLConnectionDidFinishLoading ] initWithWindow "- 그리고 나는 allocaing ivar을 계속하고 싶지 않다!

감사합니다, 당신의 순서로 끝날 일이 있다면 사람이 ... 여기에 더 나은 방향으로

답변

1

을 날 지점 수있는 경우 : 때문에 매달려의 설명으로 그 코드가 충돌합니다

[self setSearchingMode:YES]; 
[self setSearchingMode:NO]; 
[self setSearchingMode:NO]; 

HUD을 참조하십시오. [HUD release];을 수행 할 때 해당 줄 다음에 HUD = nil;을 추가하십시오.

메모리 누수가 아닙니다. 그것은 과다 출하이다. 또는, 아마, 매달린 참조.

왜를 (그리고 물론 나는 내의 dealloc에 ​​공개하지 않습니다)?당신이 그것을 유지한다면, 당신은 더 나은 그것을 풀어!

+0

setSearchingMode : NO는 NSURLConnection, b)와의 연결을 얻지 못하면 a) locationManager에서 didFailWithError, c) didFailWithError를 호출 한 이후로 내가 제안한대로하지 않는다는 것이 확실합니다. NSURLConnection에서, 그리고 d) connectionDidFinishLoading. 그럼에도 불구하고 어떻게 든 나는 무엇입니까? HUD 추가 = nil; 과 - 릴리스되는 중지 할 수 있습니까? 그리고 나는 그것을 내 함수 setSearchingMode에서 릴리즈했기 때문에 dealloc에서 풀어주지 않는다. : – coco

+0

변수를 해제 한 후에'nil'으로 변수를 설정하면'release' 메시지가 가비지 메모리로 보내지는 것을 막을 수있다. (따라서'exc_bad_access' 추락). nil로 보내지는 메시지는 아무 것도하지 않지만 메시지는 효과적으로 버려지지만 할당 취소 된 객체 (유효한 객체를 가리키는 변수가 가리키는 메모리)로 보낸 메시지는 충돌을 일으킬 수 있습니다. 더 이상 유효하지 않습니다. 나는 이것이 의미가 있기를 바랍니다. – Jasarien

+0

안녕, 나에게 새로운이야! 내가 객체를위한 메모리를 할당했다가 놓았다가 다시 놓으면 메모리 관리 문제가 생길 것이다. 그러나 객체에 메모리를 할당하고 해제 한 다음 nil로 설정하면 메모리 관리 문제없이 다시 릴리스 할 수 있습니까? – coco

관련 문제