(1)枚举的定义和元素调用
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSArray *arr1=@[@"one",@"two",@"three"];
//把数组变成枚举
NSEnumerator *enum1=[arr1 objectEnumerator];
NSString *value1;
//nextObject如果存在下一个就会返回该值,如果没有则返回nil
while (value1=[enum1 nextObject]) {
NSLog(@"%@",value1);
}
}
return 0;
}
(2)数组的排序,sortedArrayUsing...
NSArray *arr1=@[@"one",@"two",@"three"];
//因为这个数组是不可变数组,所以不恩能够对齐进行任何修改,排序当然也不行,以下方法会返回一个新的值
[arr1 sortedArrayUsingSelector:@selector(compare:)];
//我们可以用新返回的值完全覆盖之前的值,这样就相当于得到新的数组
arr1=[arr1 sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"%@",arr1);
(3)给自定义的对象排序——其实是对对象的某个成员变量进行排序
自定义初始化方法的时候注意两点:检查super init以及return self。
-(id)initWithName:(int)age addname:(NSString *)name{
if (self=[super init]) {
_age=age;
_name=name;
}
return self;
}
//重写对象的输出函数,即直接把对象变量自己输出时,本来是一个地址,现在可以重写这个函数
-(NSString *)description{
return [NSString stringWithFormat:@"age:%d name:%@",_age,_name];
}
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p1=[[Person alloc]initWithAge:18 addname:@"wang"];
Person *p2=[[Person alloc]initWithAge:22 addname:@"li"];
Person *p3=[[Person alloc]initWithAge:20 addname:@"zhang"];
NSArray *arr1=@[p1,p2,p3];
NSSortDescriptor *d1=[NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
//把d1转换成NSArray后传给下面用
NSArray *tmp1=@[d1];
//利用以下方法,但是它需要一个NSArray值
arr1=[arr1 sortedArrayUsingDescriptors:tmp1];
NSLog(@"%@",arr1);
//如果有多个呢?比如下面,则是哪个在前面,哪个优先级高先按照它排序,即d2在前面,先按照d2的排序
NSSortDescriptor *d2=[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
NSArray *tmp2=@[d2,d1];
}
return 0;
}
(4)用block方法排序
NSArray *arr2=@[@"2",@"a",@"z"];
arr2=[arr2 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
//升序排列
return [obj1 compare:obj2];
//降序排列
return [obj2 compare:obj1];
}];
NSLog(@"%@",arr2);
//如果是一个对象,那么用这个对象里面的成员变量来比较,借用上面的arr1
arr1=[arr1 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
Person *p1=obj1;
Person *p2=obj2;
return[p1.name compare:p2.name];
}];
(5)虽然定义了可变数组,但是不能在增强for循环中(for...in那种),使用[arr1 removeObject:str1]之类的删除操作,否则会导致崩溃。也就是说不能用增强for循环遍历这个数组的同时还删除这个数组的元素。可以把需要删除的元素放到一个临时数组中,然后遍历这个临时数组的同时把要删除的元素取出来当做参数给原数组,然后原数组删除这个元素。
(6)NSSet相比于NSArray是无序的,而且最重要的时:NSSet里面不能存储重复的数据,可以用这个特性去除重复元素。同样集合NSSet也有可变集合NSMutableSet。
(7)不可变的数组字典和集合都可以转化成可变的。直接在创建可变数组字典集合时候利用initWith...方法把不可变的值传递进去,如NSMutableArray *muarr1=[NSMutableArray arrayWithArray:arr1]把arr1转换成可变的。
(8)利用setWithArray把数组转换成集合。利用字典的allValues和allKeys可以转换成数组。利用字符串的componentsSeparatedByString:把字符串按特定字符为分割点转换成多个数组。
(9)当数组利用[arr1 addObject:p]添加一个对象时,会对这个对象进行一次retain操作。利用[arr1 removeObject:p]删除一个对象时,会release一次这个对象。由此可知,我们用removeAllObjects时,会被数组里面所有对象release一次。而且我们在销毁数组本身时候也会对其内部所有对象release一次,如[arr1 release];。