objective-c - 如何使对象接收到的每条消息都是线程安全的?

标签 objective-c ios multithreading thread-safety

我正在开发一个 Objective-C 应用程序,我想做的事情如下所示:

+-----------------+              +---------------+
|   Some Object   | <----------  |  Synchronize  |
|(Not Thread Safe)|              |     Proxy     |
+-----------------+            / +---------------+
                              / 
                             /  Intercepts [someobject getCount]
                            /   @synchronize (someObject)
                           /               
    [someObject getCount] /
                +----------------------+
                |  Some Calling Object |
                +----------------------+

我要问的是,如何在 objective-c 中创建一个对象,拦截发送到另一个对象的消息,以便在消息发送到该对象之前执行代码。

一些我认为行不通的东西:

  • 类别(我需要这只发生在类的某些实例上)
  • 重写对象(我无权访问对象的源代码)
  • 方法调配(再一次,这只需要对类的某些实例发生)

最佳答案

您将实现一个 NSProxy 将消息转发到您的非线程安全对象。

Here is a nice writeup Objective-C 中的消息转发,以及 here is Apple's documentation .

要处理线程安全,就看你需要什么了。如果您的非线程安全对象必须在特定线程上运行,那么您可以在所述线程上使用 NSRunLoop 将消息序列化到该对象。

Here is an example将 NSInvocation 与 NSRunLoop 结合使用。在该示例中,他们使用的是 performSelector:withObject:afterDelay:,但将其与 performSelector:onThread:withObject:waitUntilDone: 一起使用会非常相似。

否则,只需在代理中使用一个 NSRecursiveLock

关于objective-c - 如何使对象接收到的每条消息都是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8763028/

相关文章:

objective-c - NSUserNotification 状态

c++ - 适用于 iOS 的 QtCreator : How to deploy a dylib shared library with my application

iOS 模拟器显示空白黑屏或白屏

c# - C# 中的线程安全属性

java - 处理InterruptedException的最佳方法

objective-c - 如何找到引用 Objective-C 对象的位置?

ios - NSArray valueForKey : @"@max.self"?

objective-c - NSVIew 自定义 View 未调整大小

ios - Xcode 8.3 - 在本地删除包标识符?

java - 为什么用户界面卡住?