线程间通信期间的内存管理责任

时间:2010-08-31 01:53:01

标签: multithreading memory-management

如果线程A向线程B发送对象的引用,例如使用performSelector:onThread:withObject:waitUntilDone,那么应该如何进行内存管理?调用线程alloc应该是对象还是被调用线程release吗?

编辑:

事实证明performSelector:onThread:withObject:waitUntilDone保留了对象,直到选择器(将在另一个线程的运行循环中调用)完成。所以调用线程应该分配,然后调用performSelector,然后释放。

3 个答案:

答案 0 :(得分:2)

可以防止过度泄漏或涂鸦的一个选项是传递包裹在boost :: shared_ptr中的内存。当然,当多个线程具有可以访问它的shared_ptr时,您可以保证内容的使用是线程安全的,这将确保保留相关内存的最终用户的范围将导致它被释放

答案 1 :(得分:2)

事实证明performSelector:onThread:withObject:waitUntilDone保留了对象,直到选择器(将在另一个线程的运行循环中调用)完成。因此调用线程应alloc,然后调用performSelector:onThread:withObject:waitUntilDone,然后调用release

答案 2 :(得分:1)

我不确定这里是否有“正确”的答案。如果调用线程已退出或无法跟踪内存不再使用并释放它,我想你必须在被调用的线程中执行它。但是,一般来说,我更喜欢将内存释放到与分配时相同的线程中,最好在代码附近。

我认为关键是清楚地记录您的期望并保持一致性。