2009-05-27 80 views
1

我有一个针对Mac OS X 10.4和10.5的项目,其中10.5是基础SDK。10.5基本SDK 10.4部署:如何实现缺少的方法

某些方法如-[NSString stringByReplacingOccurrencesOfString:withString]在10.4中不可用。我可以手工实现这些功能。另一种选择是将该方法作为一个类别实施,但这会与10.5实现混淆,这是我想避免的。

那么我如何在10.4中实现这样的方法而不会搞乱10.5,并且在我决定停止支持10.4时可以很容易地执行实现?

+0

为什么不考虑使用10.4 SDK? – mouviciel 2009-05-27 07:58:58

+0

我正在使用一些10.5功能,尤其是界面。 – 2009-05-27 08:08:48

回答

2

我想你必须使用+load and +initializeload a method at runtime如果方法不存在。

+0

对于我没有的类,比如NSString,最好放置它的位置是什么? – 2009-05-27 11:22:19

+0

+加载,这种方法是特殊的,如果在类别中实现,则会调用该方法。这意味着你可以有超过1 +的加载方法。 – 2009-05-27 11:26:10

0

如果使用C预处理器宏插入相关方法(如果它为10.4构建的话),那么该如何处理?也许可以尝试在类别中做这样的事情,那么10.4中不存在的那些方法只包含在10.4版本中。

#if defined(MAC_OS_X_VERSION_10_4) && MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4 
// Put your implementations of the methods here 
#endif 
0

您需要支持10.4吗?如果您在应用程序的核心部分仅使用10.5方法,那么可能是时候考虑只使用10.5。

无论如何,与上面给出的具体例子,我建议把从远,使您的字符串的一个可变的副本,以便您可以使用的NSMutableString类似的方法,确实在10.4

2
if ([myString respondsToSelector: @selector(stringByReplacingOccurrencesOfString:withString:)]) 
{ 
    // 10.5 implementation 
} 
else 
{ 
    // 10.4 implementation 
} 
2

使用工作类别,但在方法名称上加上标签;例如,stringByReplacingOccurrencesOfString_TigerCompatible:。在实现中,请调用Leopard的实现或您自己的实现。

当您仅使用Leopard时,请执行项目搜索“TigerCompatible”,然后烧录所有这些方法并取消标记所有呼叫站点。

1

如果在Tiger下运行,将所有缺少的实现放在main()中启动时加载的包中。