【发布时间】:2009-06-28 13:25:44
【问题描述】:
我的应用程序执行登录到 Web 服务,然后使用登录期间收到的 sessionid 请求对象列表。
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];
}
登录操作:
-(void) main {
...
[[UIApplication sharedApplication] delegate] setSessionId:sessionID];
...
}
列表操作:
-(void)main{
//Crashes at next line:
NSString *sessionId = [[UIApplication sharedApplication] delegate] sessionId] ;
}
如果我访问任何单例对象或 AppDelegate 中的任何属性,它会崩溃。调试器显示单例对象或 Appdelegate 有效且已初始化,但该对象的任何属性均无效且访问会导致崩溃。
这是一些与线程相关的奇怪问题。我唯一能想到的是 NSOperation 在它的线程或类似的东西中有所有其他对象的无效副本。
如果使用 [NSThread detachNewThreadSelector:@selector(performList) toTarget:self withObject:nil] 在手动生成的线程中执行相同操作,它不会崩溃; 我想使用 NSOperation 而不是 NSThread detach... 因为 NSOperation 提供队列。
这种情况的最佳模式是什么?将 ListOperation 定义为并发操作?我不想复杂的定义并发操作。
我认为我的情况很简单,应该有简单的解决方案?
【问题讨论】:
-
听起来像是竞争条件或过度释放的对象。什么是创建 sessionID?什么是崩溃?回溯?这里没有足够的信息来调试它。
-
调试器显示我正在访问的对象是有效的,但该对象的所有属性都无效。我试图从 NSOperation 中访问一些单例对象,它会产生相同的崩溃条件。因此 BAD_ACCESS 崩溃。
-
我试图用 start() 方法和所有东西使它成为一个并发 NSOperation。手册说并发是在新线程中执行的。所以我认为这可能会解决问题。但事实并非如此。崩溃完全一样!
标签: objective-c iphone