假设我正在进行一些iPhone开发,并且我有一个UIViewController
的子类。并且假设此视图控制器具有NSOperationQueue
,该viewDidLoad
在dealloc
中创建并在NSInvocationOperation
中发布。
现在假设在此视图控制器处于活动状态的某个时刻,它会向NSOperationQueue
添加NSInvocationOperation
,并且操作队列开始在后台执行它。当它正在执行时,视图控制器被解雇。
正在运行NSInvocationOperation *operationDoSomething = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(synchronousDoSomething:) object:nil];
[_operationQueue addOperation:operationDoSomething];
[operationDoSomething release];
会怎样?它可以继续运行并阻止视图控制器被释放吗?
视图控制器中的示例代码:
- (void)synchronousDoSoemthing
{
[NSThread sleepForTimeInterval:1000.0];
[self finished];
}
然后这是我的视图控制器中的另一个函数:
[self finished]
因此,在上面的示例中,在调用{{1}}时,视图控制器已从导航控制器中弹出。
答案 0 :(得分:1)
是的,这不好。由于viewcontrollers是来去的东西,你不应该让它们拥有spwan线程的资源,当然不是NSOperationQueue
。
更好的方法是创建一个拥有队列的全局(单例)对象。然后,您的viewconroller可以将自己注册为观察者,以接收有关已完成任务的消息。或者只是听取这个全局对象发出的通知。