Ima*_*ake 3 iphone multithreading objective-c
我正在为iPhone编写一个应用程序,并且遇到了这种情况.
我有一个视图控制器myViewController,只要用户点击屏幕上的"后退"按钮,它就会解除锁定.后台有一个与远程服务器通信的线程,可以在myViewController中发送方法updateUI方法.
如果后台线程在myViewController中消息updateUI会发生什么,但是用户恰好在正确的时间点击了"后退"按钮,这样当updateUI仍在执行时它会导致myViewController dealloc?
我的猜测是dealloc方法将运行,如果updateUI最终使用空指针,应用程序可能会崩溃.假设是这种情况,我现有的解决方案是:
[self retain];
// updateUI code here
[self release];
Run Code Online (Sandbox Code Playgroud)
我不确定这是否是最佳解决方案,因为我觉得这在处理多个线程时是一个常见问题.
我的假设是否正确?如果是这样,有更好的解决方案吗?
你所描述的被称为"竞争条件".竞争条件可能难以在测试中识别,一旦报告就跟踪并重现,因为有时在调试器中执行可以有效地修改代码的执行方式(避免一个人试图重现的条件).竞争条件是并发编程中的主要缺陷之一 - 使得该区域看起来很难做得很好.
原则上,最佳做法是最小化共享资源的使用,并在实现并发时严格限定共享的协调方式.如果一个对象在多个线程之间共享,则每个线程都应保留该对象,以确保在每个线程完成其处理时对象保持在范围内.
Apple一直在采取措施简化并发实现.这是熟悉iOS主题的一个很好的起点. http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/Introduction/Introduction.html%23//apple_ref/doc/uid/TP40008091
了解Objective-C 2.0的属性可以支持原子操作(默认情况下是原子操作,因此禁用此默认值的非原子关键字)也很有用. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html
而且,这是老派的线程指南(不受欢迎的方法,但仍然有用的背景 - 一定要熟悉NSLock). http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/Introduction/Introduction.html%23//apple_ref/doc/uid/10000057i