1. 数组的内存管理:
假设已经创建了Student的类文件,并在student中定义了类方法如下:
+ (id)student {
return [[[Student alloc]init]autorelease];
}
倘若有以下操作
Student *stu1 = [[Student alloc]init];//此处stu1的计数为1
Student *stu2 = [[Student alloc]init];
Student *stu3 = [[Student alloc]init];
// 当把一个对象塞进数组中时,这个对象的计数器会加1,也就是说数组会对它做一次retain操作。
NSArray *array = [[NSArray alloc]initWithObjects:stu1, stu2, stu3, nil];//经过这一步后,stu1的计数为2
[stu1 release];
[stu2release];
[stu3 release];
// 数组被销毁的时候,会对内部的所有元素都做一次release操作
// 经过下面这一步release后,stu1的计数变为0
[array release];
2. 给数组里的元素发送消息
// 让数组里面的所有对象都调用test方法
//[array makeObjectsPerformSelector:@selector(test)];
[array makeObjectsPerformSelector:@selector(test2:)withObject:@"123"];
3. 数组的遍历
方式1:用for语句遍历
NSArray *array = [NSArray arrayWithObjects:stu1,@"1", @"2", @"3", nil];
intcount = array.count;
for (inti = 0; i<count; i++) {
// id == void *
id obj= [array objectAtIndex:i];
NSLog(@"%i-%@", i, obj);
}
方式2:快速遍历
int i =0;
for (id objin array) {
NSLog(@"%i-%@", i, obj);
i++;
}
方式3:用数组定义的block遍历
Student *stu1 = [Student student];
NSArray *array = [NSArray arrayWithObjects:stu1,@"1", @"2", @"3", nil];
[array enumerateObjectsUsingBlock:
^(id obj,NSUInteger idx, BOOL *stop) {
NSLog(@"%i-%@", idx,obj);
//obj为当前元素,idx为索引,*stop是停止遍历标志,用到了指针改变外部变量的方式
// 如果索引为1,就停止遍历
if (idx== 1) {
// 利用指针修改外面BOOL变量的值
*stop = YES;
}
}];
方式4:使用迭代器遍历
void arrayFor4(){
Student *stu1 = [Student student];
NSArray *array = [NSArrayarrayWithObjects:stu1, @"1", @"2", @"3", nil];
// 获取数组的迭代器
// NSEnumerator *enumerator = [arrayobjectEnumerator];
// 反序迭代器(从尾部开始遍历元素)
NSEnumerator *enumerator = [arrayreverseObjectEnumerator];
// allObjects是取出没有被遍历过的对象,倘若所有对象都已经被遍历过,那么Array2将为nil
NSArray *array2 = [enumerator allObjects];
NSLog(@"array2:%@", array2);
// 获取下一个需要遍历的元素
id obj= nil;
while (obj= [enumerator nextObject]) {
NSLog(@"obj=%@", obj);
}
}
4. 数组的一些特别方法。
(1)截取数组
NSRange range = NSMakeRange(1, 2);
NSArray *array5 = [array4 subarrayWithRange:range];
(2)利用分隔符-拼接所有数组
NSArray *array = [NSArrayarrayWithObjects:@"1", @"2", @"3",@"4", nil];
// 利用分隔符-拼接所有的数组元素
NSString *str= [array componentsJoinedByString:@"-"];
NSLog(@"%@", str);//输出结果为 1-2-3-4
(3)将一个数组写入文件或者从文件中读取数组
// 将一个数组写入文件(生成的是一个xml文件)
NSString *path =@"/Users/apple/Desktop/array.xml";
[array writeToFile:path atomically:YES];
path =@"/Users/apple/Desktop/array.txt";
// 从文件中读取数组内容(文件有严格的格式要求,否则将读不出来或出错)
NSArray *array2 = [NSArrayarrayWithContentsOfFile:path];