苹果在WWDC2012大会上介绍了大量Objective-C的新特性。在更新的XCode4.4版本中,这些新特性已经可以使用了。
参考:http://blog.devtang.com/blog/2012/08/05/use-modern-objective-c/
============局部的函数调用不用前向申明============
这虽然是一个挺小的改进,但是很贴心。假如我们在一个源文件中有2个函数:分别名为foo 和 bar,其中foo的定义在bar前面。那如果在foo函数内部直接调用bar,编译器会报警告说找不到函数bar。
而现在,我们可以随意地在源文件中放置函数bar的位置。编译器在找不到bar时,会再源码后面找,如果找到了bar,就不会报错了。
============带有类型的enum============
现在我们可以定义enum是无符号整数还是整数,这样编译器会更加智能的做类型检查。如下所示:
typedef enum TableViewCellType : NSInteger { TableViewCellTypeQueue, TableViewCellTypeNewFans, TableViewCellTypeUserInfo, TableViewCellTypeOrganization, TableViewCellTypeFeedback, TableViewCellTypeRateApp, TableViewCellTypeRecommendation, TableViewCellTypeLogout }TableViewCellType;============ 默认生成@synthesize代码 ============
编辑器发现你没有写 @synthesize时,会自动帮你加上这一行。@synthesize XX = _XX。这同时在另一方面,起到了鼓励大家使用以下划线开头的变量名作为成员变量名的作用。
当然,为了向下兼容,如果你的程序里面已经有了 @property 变量对应的 @synthesize 代码时,编辑器就不会自动帮你增加这个代码了。详见《iOS:属性...》。
另外有2种特殊情况下,即使你没有写 @synthesize ,编辑器也不会自动帮你加上,这2种情况是:
1.你同时提供了该property的setter 和 getter方法;
2.你的这个property是 readonly 的,并且你提供了其getter方法。
============遍历元素============
以前:一种是用 for in,另一种是用一个变量来循环取值;
NSArray * lines = ... for (NSString * line in lines) { // ... } for (int i = 0; i < lines.count; ++i) { NSString * s = [lines objectAtIndex:i]; ... } // 如果是字典,遍历的代码就要稍微复杂一点了: NSDictionary * dict = … NSArray * keys = [dict allKeys]; for (NSString * key in keys) { NSString * value = [dict objectForKey:key]; }xcode对于iOS4.0以上的系统,支持用block来遍历元素了。用block来遍历字典可以简化代码的编写,建议大家都使用上这个新特性
[lines enumerateObjectsUsingBlock:^(NSString * obj, NSUInteger idx, BOOL *stop) { }]; [_urlArguments enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { }];