gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 05:24:24 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com