2010-12-08 9 views
1

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

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:] 
+0

В будущем ** пожалуйста ** просмотрите свой вопрос, чтобы убедиться, что форматирование кода верное. – JeremyP 2010-12-08 09:19:30

+0

Кроме того, запустите это в отладчике, получите трассировку стека и разместите ее здесь. – JeremyP 2010-12-08 09:22:51

ответ

0

NSOperationQueue в прошивкой 4.2 теперь использует GrandCentralDispatch при запуске NSOperations. There's a Technical Q&A here

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

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

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

Смежные вопросы