NSArray
-
只能存放任意OC对象, 并且是有顺序的
-
它是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素
-
NSArray使用NSLog()输出内容,内容是小括号的格式。
-
NSArray中不能存储nil,因为NSArray认为nil是数组的结束(nil是数组元素结束的标记)。nil就是0。0也是基本数据类型,不能存放到NSArray中。
NSArray *arr = [NSArray arrayWithObjects:@"lnj", nil ,@"lmj",@"jjj", nil];
NSLog(@"%@", arr);
输出结果:
(
lnj
)
-
创建
NSArray *arr1 = @[@"lnj", @"lmj", @"jjj",]; -
访问
array[0];
NSArray给所有元素发消息
-
让集合里面的所有元素都执行aSelector这个方法
- - (void)makeObjectsPerformSelector:(SEL)aSelector;
- - (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument;
// 让数组中所有对象执行这个方法
// 注意: 如果数组中的对象没有这个方法会报错
// [arr makeObjectsPerformSelector:@selector(say)];
[arr makeObjectsPerformSelector:@selector(eat:) withObject:@"bread"];
NSArray排序
- Foundation自带类排序
NSArray *arr = @[@(1), @(9), @(5), @(2)];
NSArray *newArr = [arr sortedArrayUsingSelector:@selector(compare:)];
- 自定义类排序
NSArray *arr = @[p1, p2, p3, p4, p5];
// 默认按照升序排序
NSArray *newArr = [arr sortedArrayWithOptions:NSSortConcurrent usingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {
// 每次调用该block都会取出数组中的两个元素给我们
return obj1.age > obj2.age;
}];
NSLog(@"%@", newArr);
NSArray 与字符串
把数组元素链接成字符串
-
- (NSString )componentsJoinedByString:(NSString )separator;
- 这是NSArray的方法, 用separator作拼接符将数组元素拼接成一个字符串
NSArray *arr = @[@"lnj", @"lmj", @"jjj", @"xcq"];
NSString *res = [arr componentsJoinedByString:@"*"];
NSLog(@"res = %@", res);
输出结果:
lnj*lmj*jjj*xcq
字符串分割方法
-
- (NSArray )componentsSeparatedByString:(NSString )separator;
- 这是NSString的方法,将字符串用separator作为分隔符切割成数组元素
NSString *str = @"lnj-lmj-jjj-xcq";
NSArray *arr = [str componentsSeparatedByString:@"-"];
NSLog(@"%@", arr);
输出结果:
(
lnj,
lmj,
jjj,
xcq
)
NSMutableArray
-
NSMutableArray是可变的,随时可以往里面添加\更改\删除元素
-
不可以使用@[]创建可变数组
NSMutableArray *array = @[@"lnj", @"lmj", @"jjj"];
// 报错, 本质还是不可变数组
[array addObject:@“Peter”];
NSDictionary
- NSDictionary的作用类似:通过一个key,就能找到对应的value
- NSDictionary是不可变的, 一旦初始化完毕, 里面的内容就无法修改
- NSDictionary创建简写:
NSDictionary *dict = @{@"name":@"lnj", @"phone":@"12345678", @"address":@"天朝"};
- NSDictionary获取元素简写
dict[@"name”]; - 字典存储的时候,必须是"键值对"的方式来存储(同时键不要重复)
- 键值对中存储的数据是"无序的".
NSMutableDictionary
- NSMutableDictionary是可变的,随时可以往里面添加\更改\删除元素
- 设置键值对
dict[@"name"] = @"Jack"; - 如果是不可变数组, 那么key不能相同
如果是不可变字典出现了同名的key, 那么后面的key对应的值不会被保存
如果是在可变数组中, 后面的会覆盖前面的
NSArray和NSDictionary的区别
- NSArray是有序的,NSDictionary是无序的
- NSArray是通过下标访问元素,NSDictionary是通过key访问元素
NSNumber
- NSArray\NSDictionary中只能存放OC对象,不能存放int\float\double等基本数据类
- 如果真想把基本数据(比如int)放进数组或字典中,需要先将基本数据类型包装成OC对象
- NSNumber可以将基本数据类型包装成对象,这样就可以间接将基本数据类型存进NSArray\NSDictionary中
-
// 注意: 如果传入的是变量那么必须在@后面写上(), 如果传入的常量, 那么@后面的()可以省略 @10; @10.5; @YES; @(num); - (char)charValue; - (int)intValue; - (long)longValue; - (double)doubleValue; - (BOOL)boolValue; - (NSString *)stringValue; // 1.将基本数据类型转换为对象类型 NSNumber *ageN = [NSNumber numberWithInt:age]; NSNumber *numberN = [NSNumber numberWithDouble:number]; NSNumber *valueN = [NSNumber numberWithInt:value];
NSValue
-
NSNumber是NSValue的子类, 但NSNumber只能包装数字类型
-
NSValue可以包装任意值
- 因此, 可以用NSValue将结构体包装后,加入NSArray\NSDictionary中
常见结构体的包装
- 为了方便 结构体 和NSValue的转换,Foundation提供了以下方法
- 将结构体包装成NSValue对象
+ (NSValue *)valueWithPoint:(NSPoint)point;
+ (NSValue *)valueWithSize:(NSSize)size;
+ (NSValue *)valueWithRect:(NSRect)rect;
CGPoint point = NSMakePoint(10, 20);
NSValue *value = [NSValue valueWithPoint:point];
NSArray *arr = @[value];
- 从NSValue对象取出之前包装的结构体
- (NSPoint)pointValue;
- (NSSize)sizeValue;
- (NSRect)rectValue;
任意数据的包装
- NSValue提供了下列方法来包装任意数据
typedef struct{
int age;
char *name;
double height;
}Person;
Person p = {30, "lnj", 1.75};
// valueWithBytes: 接收一个指针, 需要传递需要包装的结构体的变量的地址
// objCType: 需要传递需要包装的数据类型
NSValue *pValue = [NSValue valueWithBytes:&p objCType:@encode(Person)];
NSArray *arr = @[pValue];
NSLog(@"%@", arr);
// 从NSValue中取出自定义的结构体变量
Person res;
[pValue getValue:&res];
NSLog(@"age = %i, name = %s, height = %f", res.age, res.name, res.height);