LLVM4
1.由标量直接创建NSNumber
NSNumber *myNumber = [NSNumber numberWithInt:3];
NSNumber *yesValue = [NSNumber numberWithBOOL:YES];
有了LLVM4,简化为:
NSNumber *myNumber = @3
NSNumber *yesValue = @YES;
注意不要加双引号,@3会转换为NSNumber对象,而@"3"会转换成NSString。默认情况下,数字标量被当做有符号整型,小数标量被当做double类型。如下面代码所示,可以通过添加F后最来告诉编译器将标量转为float类型(而不是double类型),通过添加后缀U来将标量转换为无符号整型(而不是有符号整型)。类似,L和LL后缀分别表示long和long long类型。
NSNumber *valueOfPi = @3.14F; //使用float字面量声明一个NSNumber对象
NSNumber *radius = @3U; //使用无符号integer字面量声明一个NSNumber对象
在Objective-C++中,可以使用@true和@false来声明布尔类型true和false。
2.集合字面量(NSArray和NSDictionary)
1)使用字面量创建字符串数组
NSString *str1 = @"Hello";
NSString *str2 = @"world";
NSString *str3 = @"!";
NSArray *myArray1 = [NSArray arrayWithObjects:str1,str2,str3,nil];//用旧方法创建一个新数组
NSArray *myArray2 =@[str1,str2,str3];//使用集合字面量创建一个新数组
使用字面量不必再用nil标示数组末尾,编译器自动完成这一任务
结合使用创建一个NSNumber数组:NSArray *arrayOfIntegers =@[@1,@2,@3,@4,@5];
2)创建字面量字典(测试了一下好像不行)
NSDictionary *dictionary = @[@"key1":@"value1",
@"key2:@"value2",
@"key3":@"value3"];
再次强调,这里面的任何一个元素都不可以是nil。
3)通过下标访问数组元素
NSArray *array = @[@1,@2,@3,@4,@5];
NSNumber *elmentAt3 = array[3];
int element = [elmentAt3 intValue];
4)通过下标访问字典元素(测试了一下好像不行)
NSDictionary *dictionary = @[@"key1":@"value1",
@"key2:@"value2",
@"key3":@"value3"];
int elementAt3 = dictionary[@"key3"];
5)判断字变量宏
#if __has_feature(objc_array_literals)
//使用LLVM 4 字变量的代码
#else
//不使用LLVM 4 字变量的回退代码
#endif
//检查字典字变量是否可用
#if __has_feature(objc_dictionary_literals)
#endif
//检查下标访问是否可用
#if __has_feature(objc_subscripting)
#endif
3.LLVM4自动合成属性,可以不在实现文件中写@synthesize了。LLVM4自动合成的实例变量以下划线_开头。如果写了@synthesize,且未定义实例变量,则合成的实例变量和属性同名。
@property(assign,nonatomic) int currentSegment;
另外本人发现,块也可以写成属性
@property(copy,nonatomic) void (^comletionHandler)();
注意(书上说的,未考证):LLVM4自动合成的实例变量在某些情况下(比如延时读写的实例变量)可能会带来麻烦。在这些情况下,应该通过添加下划线前缀的方式显示合成实例变量。只读属性也会存在类似的问题,为只读属性合成实例变量时使用双下划线__作为前缀,这样就可以避免某些运行时KVC方法对只读属性进行写操作。