建议使用字面量语法创建数组和字典。
数组场景一:
NSNumber *num1 = @1;
NSNumber *num2 = @2;
NSNumber *num3;
NSNumber *num4 = @4;
NSNumber *num5 = @5;
NSArray *array1 = [NSArray arrayWithObjects:num1, num2, num3, num4, num5, nil];
// NSArray *array2 = @[num1, num2, num3, num4, num5];
NSLog(@"---array1: %@", array1);
// NSLog(@"---array2: %@", array2);
// NSLog(@"---%@", array1[3]);
// NSLog(@"---%@", [array1 objectAtIndex:3]);
打印结果:
---array1: (
1,
2
)
即:arrayWithObjects:这种方式创建数组,当遇到值为nil时,数组停止创建,且不会报错,实际使用时,你可能不小心使得想要加入到数组的某个值为空了,结果得到的数组并不是你想要的,甚至你若不知道此方法遇到nil会停止创建,造成迷惑
数组场景二:
NSNumber *num1 = @1;
NSNumber *num2 = @2;
NSNumber *num3;
NSNumber *num4 = @4;
NSNumber *num5 = @5;
NSArray *array1 = [NSArray arrayWithObjects:num1, num2, num3, num4, num5, nil];
// NSArray *array2 = @[num1, num2, num3, num4, num5];
NSLog(@"---array1: %@", array1);
// NSLog(@"---array2: %@", array2);
NSLog(@"---%@", array1[3]);
// NSLog(@"---%@", [array1 objectAtIndex:3]);
或
NSNumber *num1 = @1;
NSNumber *num2 = @2;
NSNumber *num3;
NSNumber *num4 = @4;
NSNumber *num5 = @5;
NSArray *array1 = [NSArray arrayWithObjects:num1, num2, num3, num4, num5, nil];
// NSArray *array2 = @[num1, num2, num3, num4, num5];
NSLog(@"---array1: %@", array1);
// NSLog(@"---array2: %@", array2);
// NSLog(@"---%@", array1[3]);
NSLog(@"---%@", [array1 objectAtIndex:3]);
报错结果:
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 3 beyond bounds [0 .. 1]'
即:无论字面量根据下标获取相应的值还是objectAtIndex: 只要超出数组范围,均会崩溃
数组场景三:
NSNumber *num1 = @1;
NSNumber *num2 = @2;
NSNumber *num3;
NSNumber *num4 = @4;
NSNumber *num5 = @5;
// NSArray *array1 = [NSArray arrayWithObjects:num1, num2, num3, num4, num5, nil];
NSArray *array2 = @[num1, num2, num3, num4, num5];
// NSLog(@"---array1: %@", array1);
// NSLog(@"---array2: %@", array2);
// NSLog(@"---%@", array1[3]);
// NSLog(@"---%@", [array1 objectAtIndex:3]);
报错结果:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[2]'
即: 使用字面量方式创建数组时,若遇到为空的值会崩溃,实际创建数组时,往数组中添加nil往往意味着错误,字面量方式创建数组往往能较快的发现错误所在
字典场景一:
NSString *testObject;
NSDictionary *dic1 = [NSDictionary dictionaryWithObjectsAndKeys:@"HH", @"FirstName", @"CC", @"LastName", testObject, @"hi", @"BB", @"hello", nil];
// NSDictionary *dic2 = @{@"FirstName" : @"HH", @"LastName" : @"CC", @"hi" : testObject, @"hello" : @"BB"};
NSLog(@"---dic1: %@", dic1);
// NSLog(@"---dic2: %@", dic2);
NSLog(@"--%@", dic1[@"hi"]);
NSLog(@"--%@", [dic1 objectForKey:@"hi"]);
NSLog(@"--%@", dic1[@"none"]);
NSLog(@"--%@", [dic1 objectForKey:@"kkk"]);
打印结果:
---dic1: {
FirstName = HH;
LastName = CC;
}
--(null)
--(null)
--(null)
--(null)
即: 与数组类似,dictionaryWithObjectsAndKeys:方式创建字典时,遇到值为nil时,停止创建且不会报错;通过key获取其值,无论字面量获取还是objectForKey:均不会报错; 通过key获取值,即使key为不存在的,仍不会报错
字典场景二:
NSString *testObject;
// NSDictionary *dic1 = [NSDictionary dictionaryWithObjectsAndKeys:@"HH", @"FirstName", @"CC", @"LastName", testObject, @"hi", @"BB", @"hello", nil];
NSDictionary *dic2 = @{@"FirstName" : @"HH", @"LastName" : @"CC", @"hi" : testObject, @"hello" : @"BB"};
报错结果:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[2]'
即:使用字面量方式创建字典时,遇到值为空时,会造成崩溃,这样更容易发现代码逻辑的错误
因此,建议多使用字面量方式(快速创建)创建数组、字典以及NSNumber等