LLVM 4.0可以在Xcode 4.3中使用吗?

时间:2012-07-10 04:28:59

标签: objective-c ios xcode llvm

换句话说,使用文字但是针对iOS 5。

我知道this但该帖子并不是最终结论。

1 个答案:

答案 0 :(得分:22)

您可以将编译器切换出来,但它不会像您想象的那样工作(我刚刚尝试过)。编译SDK有一些要求使用这种新语法(即它适用于以前的iOS版本,但您需要使用iOS 6.0 SDK进行编译)。我不认为我现在可以在这里讨论它们,但在“现代Objective-C”WWDC 2012视频中详细介绍了它们。

基本上,您将拥有语法,但库将不知道如何响应它。

虽然有一个替代理论......我只是没做正确的^^;

最后,您没有 使用4.3来部署到5.x应用。所以我的建议只是升级,它确实没有任何缺点(除非您很快部署应用程序,但在这种情况下,转换所有内容只会是一件麻烦,因为我认为您已经完成了)。

编辑(2个月后,现在iOS 6已公开)。您绝对可以使用类别来解决新的objective-c文字语法的SDK要求。分别针对NSArrayNSDictionary添加- (id)objectAtIndexedSubscript:(NSUInteger)idx- (id)objectForKeyedSubscript:(id)key的类别,只返回objectAtIndex:objectForKey:(这就是他们在iOS中所做的事情) 6)。同样,NSMutableArrayNSMutableDictionary分别为- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)index- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)index添加类别方法,只需添加对象(如果该对象尚不存在),如果有,则替换它。< / p>

一个问题:iOS 6中YESNO的定义发生了变化,以适应NSNumber的布尔文字。所以你需要做以下事情:

#if __has_feature(objc_bool)
#undef YES //Before it was (BOOL)1
#undef NO //Before it was (BOOL)0

#define YES __objc_yes
#define NO __objc_no
#endif

原因是在新语法中已经有@( ... )语法的定义(盒装表达式),旧定义将解析为@(BOOL)1,这是一个错误。