我有一个同时针对 Mac OS X 10.4 和 10.5 的项目,其中 10.5 是基础 SDK。
有些方法-[NSString stringByReplacingOccurrencesOfString:withString]
在 10.4 中不可用。我可以手动实现该功能。另一种选择是将方法实现为一个类别,但这会与 10.5 实现混淆,这是我想避免的。
那么如何在 10.4 中实现这些方法而不会弄乱 10.5,并且当我决定停止支持 10.4 时,我可以轻松地取出实现呢?
我有一个同时针对 Mac OS X 10.4 和 10.5 的项目,其中 10.5 是基础 SDK。
有些方法-[NSString stringByReplacingOccurrencesOfString:withString]
在 10.4 中不可用。我可以手动实现该功能。另一种选择是将方法实现为一个类别,但这会与 10.5 实现混淆,这是我想避免的。
那么如何在 10.4 中实现这些方法而不会弄乱 10.5,并且当我决定停止支持 10.4 时,我可以轻松地取出实现呢?
使用类别,但在方法名称上打上标签;例如,stringByReplacingOccurrencesOfString_TigerCompatible:
。在实现中,调用 Leopard 的实现或您自己的实现。
当你只使用 Leopard 时,在项目中搜索“TigerCompatible”,然后烧毁所有这些方法并取消标记它们所有的调用站点。
if ([myString respondsToSelector: @selector(stringByReplacingOccurrencesOfString:withString:)])
{
// 10.5 implementation
}
else
{
// 10.4 implementation
}
如果该方法尚不存在,我认为您必须在运行时使用+load
并+initialize
加载该方法。
如果在 Tiger 下运行,则将所有缺少的实现放在一个包中,该包在启动时在 main() 中加载。
如果它是为 10.4 构建的,如何使用 C 预处理器宏插入相关方法?也许尝试在一个类别中做这样的事情,所以只有在为 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
你需要支持10.4吗?如果您在应用程序的核心部分使用仅 10.5 的方法,那么可能是时候考虑仅使用 10.5。
无论如何,对于上面给出的具体示例,我建议远离它并制作字符串的可变副本,以便您可以在 NSMutableString 上使用类似的方法,该方法在 10.4 中有效