Приложение IOS4.2 завершает работу с EXC_BAD_ACCESS - PullRequest
1 голос
/ 08 декабря 2010

Приложение для iPad, которое работает нормально под IOS3, не работает под IOS4.2. У него есть класс, который запускает сеанс http из очереди операций, и ошибка связана с этим действием.Вот вывод консоли:

Program received signal:  “EXC_BAD_ACCESS”.
[Switching to thread 11523]

Запуск NSZombies включен ничего не выявил, поэтому я вставил в код операторы NSLog и обнаружил, что сбой происходит при изменении локальной переменной.Вот фрагмент кода:

self.currentOperation = [[[DeduceAccessOperation alloc] init] autorelease];
[self.currentOperation addObserver:self forKeyPath:@"isFinished"
 options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
 context:NULL];
NSLog (@"Start observer added");    
[operationQueue addOperation:self.currentOperation];
NSLog (@"Start operation added");
NSLog(@"State is %d", self.status);
self.status = IEnablerServiceUpdating;
NSLog (@"State updated");

А вот вывод журнала консоли:

2010-12-08 21:26:44.548 UCiEnabler[5180:307] Start observer added
2010-12-08 21:26:44.550 UCiEnabler[5180:307] Start operation added
2010-12-08 21:26:44.552 UCiEnabler[5180:307] State is 1
Program received signal:  “EXC_BAD_ACCESS”.
[Switching to thread 11523]

Это похоже на статус, доступный только для чтения (Это свойство объявлено как атомарное и readwrite).

Другая важная информация заключается в том, что подвид только что был изменен, и он инициирует вызов вышеупомянутой подпрограммы.Это код:

//Start the update      
UCiEnablerAppDelegate *controller = (UCiEnablerAppDelegate *)[[UIApplication sharedApplication] delegate];
[controller deduceIEnablerServiceAccess];
controller.serviceBusy = TRUE; //1.04

Кто-нибудь видел что-нибудь подобное?

Кто-нибудь знает, где искать дальше?

С уважением Робин

Воттрассировка стека:

#0  0x34a80464 in objc_msgSend
#1  0x3119543e in NSKVOPendingNotificationCreate
#2  0x3119535a in NSKeyValuePushPendingNotificationPerThread
#3  0x3117009a in NSKeyValueWillChange
#4  0x311682c6 in -[NSObject(NSKeyValueObserverNotification) willChangeValueForKey:]
#5  0x311cc718 in _NSSetIntValueAndNotify
#6  0x000097ce in -[IEnablerService startDeducingAccessState] at IEnablerService.m:55
#7  0x00002bc0 in -[UCiEnablerAppDelegate deduceIEnablerServiceAccess] at UCiEnablerAppDelegate.m:100
#8  0x0000a33e in -[RootViewControlleriPad animationDidStop:finished:context:] at RootViewController-iPad.m:43
#9  0x341bb336 in -[UIViewAnimationState sendDelegateAnimationDidStop:finished:]

1 Ответ

0 голосов
/ 08 декабря 2010

NSOperationQueue в iOS 4.2 теперь использует GrandCentralDispatch при запуске NSOperations. Здесь есть технические вопросы и ответы

В значительной степени очередь теперь вызывает метод start подкласса NSOperation в новом потоке независимо от свойства isConcurrent.По моему опыту это означает, что если вы используете NSURLConnection в методе start, ваш код больше не будет выполняться, потому что поток, на котором работает start, не имеет NSRunLoop.

Apple.говорит, что это изменение не нарушает совместимость, потому что вы все равно должны были породить новый поток в методе start.

Для обратной совместимости вы должны изменить свой подкласс с использования start на использование run.

...