具有ARC服务器和32位代理的Objective-C分布式对象?

具有ARC服务器和32位代理的Objective-C分布式对象?

问题描述:

我有一个使用ARC的64位应用程序,即提供分布式对象。使用代理对象的应用程序是一个32位应用程序,因此它不使用ARC。这会对我造成问题吗?具有ARC服务器和32位代理的Objective-C分布式对象?

我也想在我的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:],但如果任何库或框架使用(包括可可和基金会)使用,可以返回NSNotFound的API是什么?更何况,这只是32位和64位运行时之间可能发生的通信问题,其他问题可能没有记录。

因为some of their other problems,我倾向于回避分布式对象,但即使您决定使用它们,这对我来说似乎是一个难题。

我不相信ARC有内在的东西可以阻止你一起使用ARC和分布式对象。但是,分布式对象的内存管理可能会非常棘手。如果您需要打破标准的retain-release规则来解决客户端与服务器之间的内存泄漏问题,ARC不会让您这样做。您需要特别小心构建您的服务器以避免这种情况。

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

+0

谢谢Michael!这是一个很好的回复! – Adam