2010-05-22 2 views
1

내 iPhone 응용 프로그램에서 XML을 읽는 사용자 지정 대리인으로 설정된 NSXMLParser 인스턴스가 있습니다. 그런 다음 이것은 자체 스레드로 이동되어 백그라운드에서 데이터를 업데이트 할 수 있습니다. 그러나이 작업을 수행 한 이후로 콘솔에 많은 _NSAutoreleaseNoPool 경고를 제공했습니다. 그러나 NSAutoreleasePool을 각 대리자 클래스에 추가하려고 시도했지만 문제를 해결하지 못했습니다. 잘못 된 경우를 대비하여 NSXMLParser를 만드는 방법을 포함했습니다.원인 _NSAutoreleaseNoPool에서 NSXMLParser 인스턴스를 중지하십시오.

NSURL *url = [[NSURL alloc] initWithString:@"http://www.mywebsite.com/xmlsource.xml"]; 
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 

CustomXMLParser *parser = [[CustomXMLParser alloc] init]; 

parser.managedObjectContext = self.managedObjectContext; 

parser = [parser initXMLParser]; 

[xmlParser setDelegate:parser]; 

[NSThread detachNewThreadSelector:@selector(parse) toTarget:xmlParser withObject:nil]; 

누구든지이 문제를 해결할 수있는 아이디어가 있다면 정말 감사하겠습니다.

감사합니다.

답변

2

objective-c에서 각 스레드는 자동으로 릴리즈 된 객체를 처리하기 위해 자체 NSAutorelease 풀이 필요합니다. 그래서 parse 방법에 당신은 NSAutoreleasePool 객체 생성 (및 해제)해야합니다

- (void)parse{ 
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 
    ... 
    // your method implementation 
    ... 
    [pool release]; 
} 
+1

그것은 @try {...} @finally {[풀 버전] 모든 것을 포장하는 것이 가장 좋습니다; } 너무, 당신이 쓰레기를 일부 예외를 얻을 경우. 물론 예외로 인해 앱이 중단되지만 예외는 아닙니다. –

+0

감사합니다 마이크, 좋은 점 – Vladimir

+0

답장을 보내 주셔서 감사합니다 블라디미르! 그러나, NSXMLParser 구문 분석을 호출 오전 -이 어딘가에 무시해야합니까? – PF1