2010-12-08 14 views
1

IOS3の下で正常に動作するiPadアプリはIOS4.2で失敗します。操作キューからhttpセッションを実行するクラスがあり、失敗はこのアクティビティにリンクしています。IOS4.2アプリはEXC_BAD_ACCESSで終了します

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

私はコード内のNSLog文を置くと、ローカル変数が変更されたときにクラッシュが発生することが判明しているので、何も明らかにしなかった有効NSZombiesを実行している:ここではコンソール出力です。ここでは、コードセクションがある:

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] 

それはあります。

その他の関連情報は、サブビューが変更されたばかりで、上記のルーチンで呼び出しをトリガーすることです。コードは

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

誰でもこのようなものを見たことがありますか?

誰にも次に見える場所はありますか? NSOperationsを開始する際のiOS 4.2で

#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

+0

また、これをデバッガで実行し、スタックトレースを取得してここにポストします。 – JeremyP

+0

クラッシュの原因となっているステータスのカスタムセッターがない可能性はありますか?その行にブレークポイントを設定し、self.status = IEnablerServiceUpdatingに入るとどうなりますか? – Rog

答えて

0

NSOperationQueueは今GrandCentralDispatchを使用しています。

よろしく ロビンは

ここでスタックトレースです。 There's a Technical Q&A here

はかなりキューは今かかわらずisConcurrentプロパティの新しいスレッドでNSOperationサブクラスのstartメソッドを呼び出します。私の経験では、startメソッドの中でNSURLConnectionを使用している場合、startのスレッドがNSRunLoopを実行していないため、コードが実行されなくなることを意味します。

アップル社は、あなたがstartメソッドで新しいスレッドを作成するはずだから、この変更は互換性を失わないと言います。

下位互換性を保つため、サブクラスをstartからrunに変更する必要があります。

+0

GCDに関する私の研究は、操作キューではなくディスパッチキュー(同時性ガイドp13)に適していることを示唆しています。しかし、NSURLConnectionsは操作キューから実行する必要があります。しかし、iOS3以降、これらを呼び出すためのより良い方法は、非同期API呼び出しです。しかし、コードを完全にテストするために環境にアクセスすることができないので、私はコードを修正したくない、またはコードを修正できません。 Arrgghhhh! –

関連する問題