Objective-C 分布式对象与 ARC 服务器和 32 位代理



我有一个使用 ARC 的 64 位应用程序,它正在提供分布式对象。 使用代理对象的应用程序是 32 位应用程序,因此它不使用 ARC。 这会给我带来麻烦吗?

我还想在我的 32 位应用程序中重用 64 位/ARC 应用程序中的类。 如果这些是 ARC,如何将它们集成到非 ARC 应用程序中?

我不建议这样做。在 32 位和 64 位运行时之间使用分布式对象似乎是可能的,但它存在一些问题。从基础常量参考:

在Mac OS X v10.5之前,NSNotFound被定义为0x7fffffff。对于 32 位系统,这实际上与 NSIntegerMax 相同。为了支持64位环境,NSNotFound现在正式定义为NSIntegerMax。但是,这意味着该值在 32 位和 64 位环境中是不同的。因此,不应将值直接保存在文件或存档中。此外,通过分布式对象在 32 位和 64 位进程之间发送值不会让你在另一端获得 NSNotFound。这适用于通过分布式对象调用的任何Cocoa方法,这些方法可能返回NSNotFound,例如NSArray的indexOfObject:方法(如果发送到数组的代理(。

当然,你可以在 -[NSArray indexOfObject:] 上进行一些基本的健全性检查,但是如果你使用的任何库或框架(包括 Cocoa 和 Foundation(使用可以返回 NSNotFound 的 API 怎么办?更不用说这只是 32 位和 64 位运行时之间通信可能发生的一个问题,其他问题可能没有记录。

由于分布式对象的其他一些问题,我倾向于回避它们,但即使您决心使用它们,这对我来说似乎也是一个交易破坏者。

我不认为 ARC 有什么固有的东西会阻止你同时使用 ARC 和分布式对象。但是,使用分布式对象进行内存管理可能很棘手。如果需要打破标准的保留-发布规则来解决客户端和服务器之间的内存泄漏,ARC 不会允许您这样做。您需要格外小心地构建服务器以避免这种情况。

最后,由于您无法在 32 位运行时中使用 ARC,因此您必须为这些类编写手动保留/发布代码。如果您计划最终摆脱非 ARC 代码,则可以利用 __has_feature(objc_arc(。否则,最好不要在计划在 32 位和 64 位应用程序之间共享的文件上使用 ARC。可以基于每个文件启用或禁用 ARC。

最新更新