对象方法:
1.常用遍历方法:
// 使用OC数组的迭代器来遍历
// 每取出一个元素就会调用一次block
// 每次调用block都会将当前取出的元素和元素对应的索引传递给我们
// obj就是当前取出的元素, idx就是当前元素对应的索引
// stop用于控制什么时候停止遍历
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if (idx == 1) {
*stop = YES;
}
NSLog(@"obj = %@, idx = %lu", obj, idx);
}];
2.调用OC数组的方法让数组中所有的元素都执行指定的方法:
Person *p1 = [Person new];
Person *p2 = [Person new];
Person *p3 = [Person new];
Person *p4 = [Person new];
NSArray *arr = @[p1, p2, p3, p4];
第一种方式:
[arr enumerateObjectsUsingBlock:^(Person *obj, NSUInteger idx, BOOL *stop) {
[obj say];
}];
第二种方式:
// 如果使用OC数组存储对象, 可以调用OC数组的方法让数组中所有的元素都执行指定的方法
// 注意点: 如果数组中保存的不是相同类型的数据, 并且没有相同的方法, 那么会报错
[arr makeObjectsPerformSelector:@selector(say)];
第三种方式:
// withObject: 需要传递给调用方法的参数
[arr makeObjectsPerformSelector:@selector(sayWithName:) withObject:@"lnj"];
3.排序:
NSArray *arr = @[@10, @20, @5, @7, @15];
NSLog(@"排序前: %@", arr);
// 注意: 想使用compare方法对数组中的元素进行排序, 那么数组中的元素必须是Foundation框架中的对象, 也就是说不能是自定义对象
NSArray *newArr = [arr sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"排序后: %@", newArr);
自定义对象中的某个属性排序:
Person *p1 = [Person new];
p1.age = 10;
Person *p2 = [Person new];
p2.age = 20;
Person *p3 = [Person new];
p3.age = 5;
Person *p4 = [Person new];
p4.age = 7;
NSArray *arr = @[p1, p2, p3, p4];
NSLog(@"排序前: %@", arr);
// 按照人的年龄进行排序
// 不能使用compare:方法对自定义对象进行排序
// NSArray *newArr = [arr sortedArrayUsingSelector:@selector(compare:)];
// 该方法默认会按照升序排序
NSArray *newArr = [arr sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {
// 每次调用该block都会取出数组中的两个元素给我们
// 二分
NSLog(@"obj1 = %@, obj2 = %@", obj1, obj2);
//return obj1.age > obj2.age;//升序
return obj1.age < obj2.age;//降序
// if (obj1.age > obj2.age) {
// // 5 4
// return NSOrderedDescending;
// }else if(obj1.age < obj2.age)
// {
// // 4 5
// return NSOrderedAscending;
// }else
// {
// return NSOrderedSame;
// }
}];
NSLog(@"排序后: %@", newArr);
4.数组--文件读写:
// 1.将数组写入到文件中
NSArray *arr = @[@"lnj", @"lmj", @"jjj"];
// 其实如果将一个数组写入到文件中之后, 本质是写入了一个XML文件
// 在iOS开发中一般情况下我们会将XML文件的扩展名保存为plist
//注意:writeToFile只能写入数组中保存的元素都是Foundation框架中的类创建的对象, 如果保存的是自定义对象那么不能写入
BOOL flag = [arr writeToFile:@"/Users/xiaomage/Desktop/abc.plist" atomically:YES];
NSLog(@"flag = %i", flag);
// 2.从文件中读取一个数组
/*
NSArray *newArray = [NSArray arrayWithContentsOfFile:@"/Users/xiaomage/Desktop/abc.plist"];
NSLog(@"%@", newArray);
*/
5.可变数组 插入(一组数据):
NSRange range = NSMakeRange(2, 2);
NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:range];
// 插入一组数据, 指定数组需要插入的位置, 和插入多少个
[arrM insertObjects:@[@"A", @"B"] atIndexes:set];
6.集合对象的内存管理
/*
// 1. 如果将一个对象添加到一个数组中, 那么数组会对对象进行一个retain
Person *p = [Person new];
NSLog(@"reatinCount = %lu", [p retainCount]);
NSMutableArray *arrM = [[NSMutableArray alloc] init];
[arrM addObject:p];
NSLog(@"reatinCount = %lu", [p retainCount]);
[p release];
NSLog(@"reatinCount = %lu", [p retainCount]);
// 当数组对象释放之后, 会给数组中所有的对象发送一条release消息
[arrM release];
*/
Person *p = [Person new]; // 1
NSLog(@"reatinCount = %lu", [p retainCount]);
NSMutableArray *arrM = [[NSMutableArray alloc] init];
[arrM addObject:p]; // 2
NSLog(@"reatinCount = %lu", [p retainCount]);
[p release]; // 1
// 当数组移除一个对象之后, 会给这个对象发送一条release消息
[arrM removeObject:p];
7.字符分解成数组
NSArray *arr = [str componentsSeparatedByString:@"#"];
8.是否包含某个元素
// 取出模型 XMGDeal *deal = self.deals[indexPath.row]; if ([self.deletedDeals containsObject:deal]) { [self.deletedDeals removeObject:deal]; } else { [self.deletedDeals addObject:deal]; }