Приложение iPhone падает, если при загрузке данных происходит смена представления - PullRequest
0 голосов
/ 06 декабря 2010

У меня есть приложение для 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'

Ответы [ 2 ]

1 голос
/ 07 декабря 2010

unrecognized selector означает, что вы пытались отправить сообщение объекту, который не знает, как его обработать.

Например, предположим, что у вас есть класс AlienParser и у него есть два метода: land и probe. Вы создаете его экземпляр с именем myParser, а затем пытаетесь вызвать [myParser destroyAllHumans]. Полученный объект не будет знать, что делать, и вы получите исключение. Он компилируется, потому что вы можете отправить любое сообщение чему угодно с помощью Obj-C, потому что во время выполнения он может знать, как с ним справиться, даже если компилятор не может это обнаружить.

Где-то (гекс является вашей подсказкой, он не показывает полную обратную трассировку) у вас есть код, вызывающий другой объект с сообщением, которое он просто не поддерживает. Вероятно, стоит упомянуть, что ЛЮБОЕ сообщение на nil ничего не делает и возвращает nil, поэтому у вас, очевидно, есть реальный объект, на который вы отправляете сообщения.

1 голос
/ 07 декабря 2010

Вы пытались загрузить XML в фоновом потоке?Это может облегчить некоторые проблемы, поскольку основной поток не будет заблокирован.Вы должны быть в состоянии нажать на RssFunViewController во время загрузки / скачивания XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...