Webサービスへのログインを実行し、ログイン中に受信したsessionidを使用してオブジェクトのリストを要求するアプリケーションがあります。NSOperation内から他のオブジェクトにアクセスする方法は?スレッドの問題がクラッシュする
Appdelegate.h
....
@property (nonatomic, retain) NSString *sessionId;
AppDelegate.m:
-(id)init{
queue = [[NSOperationQueue alloc] init];
[queue setMaxConcurrentOperationCount:1];
.....
}
- (void)applicationDidFinishLaunching:(UIApplication *)application {
LoginOperation *loginOperation = [[LoginOperation alloc] init];
[queue addOperation:loginOperation];
[loginOperation release];
ListOperation *listOperation = [[ListOperation alloc] init];
[queue addOperation:listOperation];
[listOperation release];
}
LoginOperation:
-(void) main {
...
[[UIApplication sharedApplication] delegate] setSessionId:sessionID];
...
}
ListOperation:
-(void)main{
//Crashes at next line:
NSString *sessionId = [[UIApplication sharedApplication] delegate] sessionId] ;
}
シングルトンオブジェクトまたはAppDelegateでプロフェッティにアクセスするとクラッシュします。デバッガは、シングルトンオブジェクトまたはAppdelegateが有効で初期化されているが、そのオブジェクトのANYプロパティが無効であり、アクセスがクラッシュすることを示しています。
これはいくつかの奇妙なスレッド関連の問題です。私が考えることができる唯一のことは、NSOperationにスレッドやそのようなものにある他のすべてのオブジェクトの無効なコピーがあることです。
[NSThread detachNewThreadSelector:@selector(performList)toTarget:self withObject:nil]を使用して手動で生成されたスレッドで同じことを行うと、クラッシュしません。 NSOperationがキューを提供するので、NSThread detach ...の代わりにNSOperationを使用します。
このような状況に最適なパターンは何ですか?並行操作としてListOperationを定義していますか?私はコンカレントオペレーションを定義することで複雑な混乱を望んでいません。
私のケースはかなり単純だと思いますが、単純な解決策が必要ですか?
競合状態またはオーバーリリースオブジェクトのように聞こえる。 sessionIDを作成していますか?クラッシュは何ですか?バックトレース? ここにはデバッグするための十分な情報がありません。 – bbum
デバッガは、私がアクセスしているオブジェクトが有効だが、オブジェクトのすべてのプロパティが無効であることを示しています。 NSOperation内からシングルトンオブジェクトにアクセスしようとしましたが、同じクラッシュ条件が発生します。 したがって、BAD_ACCESSがクラッシュします。 – Rod
私はこのメソッドをstart()メソッドとすべてを使ってConcurrent NSOperationにしようとしました。 マニュアルでは、新しいスレッドでconcurrentが実行されると記載されています。だから私はそれが問題を解決するかもしれないと思った。 しかし、そうではありません。クラッシュはまったく同じです! – Rod