我正在开发一个 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/