zoukankan      html  css  js  c++  java
  • Xcode 4.4 的新特性 | LLVM 4.0 的新语法

    WWDC 2012苹果全球开发者大会上,苹果针对LLVM编译器都做了重大改进,新版的Xcode 4.4中的LLVM编译器升级到了4.0,给Objective-C带来了很多令人惊喜的特性。

    注意,下面的语法需要下载Xcode 4.4。

    1、枚举类型的改变

    老写法:

    [cpp] view plaincopy
     
    1. typedef enum Week{  
    2.     Moday,  
    3.     Tuesday,  
    4.     Wednesday,  
    5.     Thursday,  
    6.     Friday,  
    7.     Saturday,  
    8.     Sunday      
    9. }Week;  

    老方法的问题是枚举值的数据范围是模糊的,这个数值可能非常大,可能是负数,无法界定


    新写法:

    [cpp] view plaincopy
     
    1. typedef enum Week:NSUInteger{  
    2.     Moday,  
    3.     Tuesday,  
    4.     Wednesday,  
    5.     Thursday,  
    6.     Friday,  
    7.     Saturday,  
    8.     Sunday      
    9. }Week;  

    新方法在列出枚举内容的同时绑定了枚举数据类型NSUInteger,这样带来的好处是增强的类型检查和更好的代码可读性。

    2、使用的方法代码放置的位置顺序无关

    没在.h文件中声明的方法,在时候的时候如果方法不在前面,可能会有警告。

    比如:

    [cpp] view plaincopy
     
    1. @interface MyClass : NSObject  
    2. -(void)doSomething:(NSString *) print;  
    3. @end  


    实现:

    [cpp] view plaincopy
     
    1. @implementation MyClass  
    2. -(void)doSomething:(NSString *)print{  
    3.     NSLog(@"%@", [print stringByAppendingFormat:[self getString]]);  
    4. }  
    5. -(NSString *)getString{  
    6.     return@"string for something";  
    7. }  
    8. @end  


    早期编译器编译时会出现:warning: instance method ‘-getString:’ not found…

    新的编译器会先扫描代码中的方法,然后再编译,这样就避免了找不到方法这种情况了

    3、property属性简化

    @property对于使用Objective-C的程序员来说是相当熟悉的,property方便自动生成变量的getter 和setter。在.h文件中声明之后,还要在.m文件中加上@synthesize关键字,这样才能完成自动getter 和setter的过程。

    比如说,我在.h文件中写了

     

    @property (strongnonatomicNSDictionary *order;

    我还要去对于的.m文件中写上

     

    @synthesize order;

    是不是感觉很多余啊?现在在语法新特性中不用写这行代码了,新版的编译器帮你实现这行代码,这叫帮人帮到底。

    也是说,你在.h文件中声明order属性后,就可以直接在实现文件中使用该属性的getter和setter方法,编译器还会根据属性的可读和可写自动判断是否提供setter方法。智能多了。

    4、语法的简化

    做过java 或C#开发的都知道,初始化或赋值一个变量一般用一个“=”号就搞定了,到了Objective-C后,每次都要用一个很长的函数才能赋值活初始化。现在简化多了。

    咱们看看各个数据类型简化前后的对比。

    4.1、NSNumber 类型

    老写法:

    [cpp] view plaincopy
     
    1. NSNumber *number;  
    2. number = [NSNumber numberWithChar:'X'];  
    3. number = [NSNumber numberWithInt:12345];  
    4. number = [NSNumber numberWithUnsignedLong:12345ul];  
    5. number = [NSNumber numberWithLongLong:12345ll];  
    6. number = [NSNumber numberWithFloat:123.45f];  
    7. number = [NSNumber numberWithDouble:123.45];  
    8. number = [NSNumber numberWithBool:YES];  

    新写法:

    [cpp] view plaincopy
     
    1. NSNumber *number;  
    2. number = @'X';  
    3. number = @12345;  
    4. number = @12345ul;  
    5. number = @12345ll;  
    6. number = @123.45f;  
    7. number = @123.45;  
    8. number = @YES;  

    4.2、NSArray类型

    老写法:

    [cpp] view plaincopy
     
    1. NSArray *array;  
    2. array = [NSArray arrayWithObjects:@"object1", @"object2", @"object3", nil];  


    新写法:

    [cpp] view plaincopy
     
    1. NSArray *array = @[ @"object1", @"object2", @"object3" ];  


    新的写法去掉了后面讨厌的nil。

    4.3、NSDictionary类型

    老写法

    [cpp] view plaincopy
     
    1. NSDictionary *dict = [NSDictionary dictionaryWithObjects:@[@"value1", @"value2", @"value3"]  
    2.                                    forKeys:@[@"key1", @"key2", @"key3"]];  

    新写法

    [cpp] view plaincopy
     
    1. NSDictionary *dict = @{@"key1": @"value1",@"key2": @"value2",@"key3": @"value3" };  
    2. NSLog(@"%@", dict);  

    运行结果正常:

    {

        key1 = value1;

        key2 = value2;

        key3 = value3;

    }

    5、快速通过下标定位对象

    他们说新的语法这样是可以的,数组和字典都可以通过下标访问,

    [cpp] view plaincopy
     
    1. NSArray *array =@[ @"object1", @"object2", @"object3" ];  
    2.   
    3. id obj = array[0]; //通过下标方式获取数组对象,替换原有写法:array objectAtIndex:i];  
    4. NSString *obj1  = @"oooo";  
    5. array[0]  = obj1; //也可以直接为数组对象赋值。替换原有写法:[array replaceObjectAtIndex:i withObject:newObj];  
    6.   
    7. NSDictionary *dict = @{@"key1": @"value1",@"key2": @"value2",@"key3": @"value3" };  
    8. id obj2 = dict[@"key1"];//获取o2对象,替换原有写法:[dic objectForKey:k2];  
    9. dict[@"key2"] = obj;  //重新为键为k2的对象赋值,替换原有写法:[dic setObject:newObj forKey:k2]  

    可是事实是这样的:


    现实总是残忍的。于是google 了一下,发现这个语法是针对iOS 6 or OS X 10.8 SDKs的,我没有ios 6模拟器而已没有10.8 SDKs。所以报错了。可以参考这里:http://stackoverflow.com/questions/11425976/compiler-error-expected-method-not-found-when-using-subscript-on-nsarray

    下面是WWDC 2012视频的一些关于新语法特性的截图:

    截图可以给你解释,新的语法特性编译器是怎么实现的。

  • 相关阅读:
    jvisualm 结合 visualGC 进行jvm监控,并分析垃圾回收
    linux 查看服务器cpu 与内存配置
    arthas 使用总结
    selinux contexts 安全上下文的临时更改
    Android 8.1 Doze模式分析(五) Doze白名单及Debug方式
    Window 任意窗口置顶软件Window TopMost Control
    Android ApkToolPlus一个可视化的跨平台 apk 分析工具
    SVN Please execute the 'Cleanup' command.
    Android 如何在64位安卓系统中使用32位SO库
    Android cmd命令查看apk是32位还是64位?
  • 原文地址:https://www.cnblogs.com/easonoutlook/p/3108091.html
Copyright © 2011-2022 走看看