2010-03-14 4 views
0

와 메모리를 누출하는 것은 어쩌면 사람이 이상한 것 좀 도와 수 있습니다 : 버튼에 사용자가 클릭이 새로운 jQuery과이 탐색 컨트롤러로 보내지면아이폰 SDK - performSelectorInBackground

. 이 새로운 뷰는 약간의 시간이 걸리는 데이터베이스 쿼리를 수행하고 있습니다. 그래서 백그라운드에서 로딩을하고 싶었습니다.

WorkController *tmp=[[WorkController alloc] initWithStyle:UITableViewStyleGrouped]; 
self.workController=tmp; 
[tmp release]; 

[self.workController loadList]; // Does the DB Query 
[self.workController pushViewController:self.workController animated:YES]; 

은 지금이하려고 노력 :

// Show Wait indicator 
    .... 

    WorkController *tmp=[[WorkController alloc] initWithStyle:UITableViewStyleGrouped]; 
    self.workController=tmp; 
    [tmp release]; 

    [self performSelectorInBackground:@selector(getController) withObject:nil]; 
} 

-(void) getController { 
    [self.workController loadList]; // Does the DB Query 
    [self.navigationController pushViewController:self.workController animated:YES]; 
} 

이것은 또한 작동을하지만, 메모리 및 I를 유출 메모리가 누수없이 작동합니다 (그러나 모든 것이 완료 될 때까지 화면을 정지) 무엇

왜 그런지 모르겠다! 도와 드릴까요? 그런데

-이 앱은 작은 메모리 누수와 앱 스토어에 들어갈 수 있습니까? 또는 이것을 먼저 점검 할 것인가?

미리 감사드립니다.

+1

누출 위치는 어디입니까? –

+0

안녕하세요, getController 메서드 내에 누수가 있습니다. – Steblo

+0

음, 어디서? workController를 해제하지 마십시오 ?? –

답변

5

아니, 작은 메모리 누수가 (대부분)를 응용 프로그램이 앱 스토어에서 거부 할 수 없습니다. 당신의 예에서

당신은 당신이 만들고 오토 릴리즈 객체를 처리하는 스레드에 대한 NSAutoreleasePool 객체를 처리해야한다 별도의 스레드에서 메소드를 실행한다. getController 방법에 대한 변경 사항을 따르는 것은 트릭을 수행해야합니다 자세한 내용은

-(void) getController { 
    NSAutoreleasedPool *pool = [[NSAutoreleasedPool alloc] init]; 

    [self.workController loadList]; // Does the DB Query 
    [self.navigationController pushViewController:self.workController animated:YES]; 

    [pool release]; 
} 

은 메모리 관리 가이드 Autorelease Pools 절을 참조하십시오. 거기에서 관련 인용 : 당신이 보조 스레드를 생성 할 경우 스레드가 실행 을 시작으로

, 당신 은 즉시 자신의 오토 릴리즈 풀 을 만들어야합니다; 그렇지 않으면 개체가 유출됩니다. (자세한 내용은 “Autorelease Pools and Threads”을 참조하십시오.)

+0

먼저 답장을 보내 주셔서 감사합니다. 그러나 NSAutorelease 풀은 어디에 사용됩니까? 그냥 할당 및 해제되지 않습니다? – Steblo

+0

감사합니다. 풀을 사용하는 것은 트릭을했다. 그것은 누출없이 지금 작동 (그리고 백그라운드 스레드에서 스택보기를 밀어 수) – Steblo

+1

NSAutoreleasePool는 오토 릴리즈 객체를 처리하고 실제로 출시 될 것이라고 확신합니다. 비록 당신이 그것을 창조하고 발표하는 것처럼 보일지라도 그것은 많은 일을합니다. – Vladimir

0

Btw, 배경 스레드에서 pushViewController: (으)로 전화하고 있습니다. 이것은 나쁘다.

경우에만 UI에 일을해야 - 메인 스레드에서 - 뷰 컨트롤러를 밀어 UI 항목을 변경하는 등. 그렇지 않으면, 일이 깨어집니다.

"코코아 프레임 워크는 스레드로부터 안전?"라는 제목의 코코아 기초 가이드 섹션을 참조하십시오 : 그것이 말하는 "모든 UIKit 객체가 메인 스레드에서만 사용되어야합니다."