detachNewThreadSelector аварийно завершает работу приложения - PullRequest
4 голосов
/ 09 мая 2011

Я разрабатываю приложение для iphone, в котором я извлекаю RSS-каналы, а затем анализирую их. Мой код выглядит следующим образом:

 - (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    NSLog(@"in view did appear");

    if ([stories count] == 0) {
        NSString * path = @"http://www.shire.com/shireplc/rss.jsp";

        //[self parseXMLFileAtURL:path];
        //[self performSelectorInBackground:@selector(parseXMLFileAtURL:) withObject:path];
        NSLog(@"internet is %d",[self checkInternet]);
        if([self checkInternet]==1)
        [NSThread detachNewThreadSelector:@selector(parseXMLFileAtURL:) 
                              toTarget:self withObject:path];

}
}

 - (void)parseXMLFileAtURL:(NSString *)URL
  { 
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  stories = [[NSMutableArray alloc] init];

  //you must then convert the path to a proper NSURL or it won't work
  NSURL *xmlURL = [NSURL URLWithString:URL];

  // here, for some reason you have to use NSClassFromString when trying to alloc NSXMLParser, otherwise you will get an object not found error
  // this may be necessary only for the toolchain
  rssParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];

  // Set self as the delegate of the parser so that it will receive the parser delegate methods callbacks.
[rssParser setDelegate:self];

// Depending on the XML document you're parsing, you may want to enable these features of NSXMLParser.
[rssParser setShouldProcessNamespaces:NO];
[rssParser setShouldReportNamespacePrefixes:NO];
[rssParser setShouldResolveExternalEntities:NO];

[rssParser parse];

 [pool release];

}

Может кто-нибудь сказать мне, где я иду не так?Мой журнал выглядит следующим образом: log: [Переключение на тему 12803] [Переключение на тему 12035] 2011-05-10 11: 31: 30.932 Годовой отчет [454: 490b] нашел файл и начал синтаксический анализ [Переключение на тему 14339] 2011-05-10 11: 32: 04.742 Годовой отчет [454: 640b] обнаружил файл и начал анализ [Переключение на поток 13827] [Переключение на поток 13827] Программа получила сигнал: «EXC_BAD_ACCESS».

gdb stack trace at 'putpkt: write failed':
0   gdb-arm-apple-darwin                0x0019026b remote_backtrace_self + 54

Ответы [ 3 ]

0 голосов
/ 16 мая 2011

Наконец, я использовал флаг, чтобы проверить, появилось ли представление или нет (установив флаг true в viewdidAppear), и если представление не появляется, не запускайте функцию потока. Это решило проблему !!!

0 голосов
/ 30 мая 2013

// вы можете использовать метод, который безопаснее, если вам не нужно обновлять UserInterface

 [self performSelectorInBackground:@selector(parseXMLFileAtURL:) withObject:path];

, если также необходимо обновить UserInterface, вы можете сначала проанализировать данные в фоновом режиме и обновить интерфейсс методом.

[self performSelectorOnMainThread:@selector(myUpdateUI) withObject:nil waitUntilDone:YES];
0 голосов
/ 10 мая 2011

Я не уверен, но я думаю, что параметр для метода будет выпущен в какой-то момент.Можете ли вы убедиться, что URL присутствует в методе parseXMLFileAtURL

...