2010-12-06 7 views
0

사용자가 uitable에서 행을 클릭하면 행 값을 받아 웹에서 일부 데이터를 다운로드하여 다음보기를 채 웁니다. 그러나 사용자가 데이터를 다운로드 할 때 첫 번째보기로 다시 전환하면 앱이 다운됩니다. 이 다운로드를 완료하면이 코드의 다음 줄이기 때문에 충돌 곳데이터 다운로드 중에보기가 바뀌면 iPhone 앱이 충돌합니다.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

NSManagedObject *selectedObject = [[self fetchedResultsController] objectAtIndexPath:indexPath]; 
BlogRssParser *blogRss = [[BlogRssParser alloc] init]; 
blogRss.terms = [[selectedObject valueForKey:@"data"] description]; 

RssFunViewController *rssFun = [[RssFunViewController alloc] initWithNibName:@"RssFunViewController" bundle:nil]; 

rssFun.rssParser = blogRss; 
[blogRss release]; 
[self.navigationController pushViewController:rssFun animated:YES]; 
rssFun.navigationItem.title=blogRss.terms; 
[rssFun release]; 
[tableView deselectRowAtIndexPath:indexPath animated:YES]; 

}

을 그래서 [self.navigationController pushViewController:rssFun animated:YES];을 말한다 곳이다 : 나는 내가 문제를 발견했습니다 생각하지만, 도움이 필요 그것을 고정 그게 올바른 화면에 없다면보기를 밀어 넣을 수 있습니다! 어쨌든 어떤 조언을 주셔서 감사합니다!

BlogRssParser :

-(BOOL)fetchAndParseRss{ 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 

//To suppress the leak in NSXMLParser 
[[NSURLCache sharedURLCache] setMemoryCapacity:0]; 
[[NSURLCache sharedURLCache] setDiskCapacity:0]; 

NSString *urlTerm = terms; 
urlTerm = [urlTerm stringByReplacingOccurrencesOfString:@" " withString:@"+"]; 
urlTerm = [urlTerm stringByReplacingOccurrencesOfString:@"\t" withString:@""]; 
urlTerm = [urlTerm stringByReplacingOccurrencesOfString:@"&" withString:@""]; 
urlTerm = [urlTerm stringByReplacingOccurrencesOfString:@"'" withString:@""]; 
urlTerm = [urlTerm stringByReplacingOccurrencesOfString:@"-" withString:@""]; 
urlTerm = [urlTerm stringByReplacingOccurrencesOfString:@"_" withString:@""]; 

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"xxxxxxxxxxxxx/app.php?s=%@", urlTerm]]; 
NSLog(@"%@", url); 

BOOL success = NO; 
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 
[parser setDelegate:self]; 
[parser setShouldProcessNamespaces:YES]; 
[parser setShouldReportNamespacePrefixes:YES]; 
[parser setShouldResolveExternalEntities:NO]; 
success = [parser parse]; 
[parser release]; 
[pool drain]; 
return success; 

}

콘솔 :

2010-12-06 19:15:09.826 Example[452:207] -[NSCFString processCompleted]: unrecognized selector sent to instance 0x6123d30 
2010-12-06 19:15:09.855 Example[452:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString processCompleted]: unrecognized selector sent to instance 0x6123d30' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x02664b99 __exceptionPreprocess + 185 
    1 libobjc.A.dylib      0x027b440e objc_exception_throw + 47 
    2 CoreFoundation      0x026666ab -[NSObject(NSObject) doesNotRecognizeSelector:] + 187 
    3 CoreFoundation      0x025d62b6 ___forwarding___ + 966 
    4 CoreFoundation      0x025d5e72 _CF_forwarding_prep_0 + 50 
    5 Foundation       0x000423ca __NSThreadPerformPerform + 251 
    6 CoreFoundation      0x02645faf __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15 
    7 CoreFoundation      0x025a439b __CFRunLoopDoSources0 + 571 
    8 CoreFoundation      0x025a3896 __CFRunLoopRun + 470 
    9 CoreFoundation      0x025a3350 CFRunLoopRunSpecific + 208 
    10 CoreFoundation      0x025a3271 CFRunLoopRunInMode + 97 
    11 GraphicsServices     0x02f4300c GSEventRunModal + 217 
    12 GraphicsServices     0x02f430d1 GSEventRun + 115 
    13 UIKit        0x002d1af2 UIApplicationMain + 1160 
    14 Example        0x0000244a main + 84 
    15 Example        0x000023ed start + 53 
) 
terminate called after throwing an instance of 'NSException' 
+0

"다운로드가 끝나면 다음 코드 줄"이란 무엇을 의미합니까? 게시 한 코드, 다운로드를 시작한 위치 또는 끝날 때 호출되는 코드가 표시되지 않습니다. – filipe

+0

죄송합니다 BlogRssParser는 XML을 가져 오는 클래스입니다. 클릭 된 행의 값이 입력되고 XML 파일이 반환되어 다음보기를 채 웁니다. – benhowdle89

+0

다운로드 할 수 있도록 BlogRssParser에 코드를 게시 할 수 있습니까? – aahrens

답변

1

unrecognized selector은 처리 방법을 모르는 개체로 메시지를 보내려고했음을 의미합니다.

예를 들어 클래스가 AlienParser이고 두 가지 방법이 landprobe 인 경우를 가정합니다. myParser이라는 인스턴스를 만든 다음 [myParser destroyAllHumans]을 호출하려고했습니다. 결과 객체는 수행 할 작업을 알 수 없으며 예외가 발생합니다. Obj-C를 사용하여 메시지를 보낼 수 있기 때문에 컴파일됩니다. 런타임에 컴파일러가이를 감지 할 수 없더라도이를 처리하는 방법을 알고 있기 때문입니다.

어딘가에 (16 진수는 단서이며 전체 백 트레이스가 표시되지 않음) 다른 객체를 호출 할 수있는 코드가 있습니다. nil에 대한 메시지가 아무 것도하지 않고 nil을 반환한다는 것을 언급 할 가치가 있습니다. 실제로 메시지를 보내는 실제 개체가 분명히 있습니다.

+0

자, 당신이 말한 것은 감각을 많이 띄게했는데, 감사합니다. 그런데 내 O/P에서 그 코드에서 무슨 일이 일어나는지 알아볼 수 있습니까? – benhowdle89

1

당신이 백그라운드 스레드에서 XML을 다운로드 시도? 이렇게하면 주 스레드가 차단되지 않으므로 문제가 완화 될 수 있습니다. XML이 다운로드되는 동안 RssFunViewController를 푸시 할 수 있어야합니다.

+0

똑똑한 소리는 들리지만 어떻게 할 지 모른다. – benhowdle89

+0

이 게시물을보십시오 http://stackoverflow.com/questions/873200/memory-management-and-performselectorinbackground – aahrens

+0

XML을 얻는 방법에 대해 더 많은 코드를 게시하면 더 쉽게 말할 수 있습니다. – aahrens

관련 문제