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

时间:2012-05-15 13:08:10

标签: objective-c automatic-ref-counting distributed-objects nsconnection

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

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

1 个答案:

答案 0 :(得分:1)

我不建议这样做。在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位运行时之间进行通信的一个问题,其他问题可能没有记录。

由于some of their other problems,我倾向于回避分布式对象,但即使你决定使用它们,这对我来说似乎也是一个交易障碍。

我不相信ARC有任何固有的东西可以阻止你一起使用ARC和分布式对象。但是,使用分布式对象进行内存管理可能会非常棘手。如果您需要打破标准的保留释放规则来解决客户端和服务器之间的内存泄漏问题,ARC将不允许您这样做。您需要格外小心地构建服务器以避免这种情况。

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