Collection类
Collection类的实例用于保存指向其他对象的指针。
24.1NSSet/NSMutableSet
NSSet对象所包含的“内容”是无序的。而且在一个NSSet对象中,某个特定的对象只能出现一次。
NSSet对象的最大用处就是检查某个对象是否存在。例如,你有一组儿童不宜进入的网站链接,再为小孩打开某个网页时,最好先查看相应的网页是否在这个儿童不宜组里。NSSet对象完成此类任务的速度比数组快的对。
它也有NSMutableSet
NSSet对象中的对象是无序的,所以不能通过索引来访问,只能向NSSet对象查询某个对象是否寻找。可以使用下面的方法来查询
-(BOOL) containsObject :(id)x;
NSObject类定义了一个名为 isEqual:的方法。日过程序要检查这两个对象是否相等,就可以使用isEqual方法
-(BOOL)isEqual : (id) other
{
return (self == other);
}
在苹果公司提供的类中,有些覆盖率isEqual:方法,例如NSString。覆盖后的方法会比较字符串中的字符。
equal:相等的 字符相等
identical:相同的,同一个对象,地址相同。
24.2NSDictionary/NSMutableDictionary
键值对(key value pair)。健通常是字符串,值可以是任意类型的对象。以键为索引。·
24.3不可修改对象
虽然对外声明的是NSArray,但实际创建的是NSMutableArray
使用不可修改对象可以节约内存提高性能。因为它永远无序拷贝。
24.4数组排序
-(void)sortUsingDexcriptors:(NSArray *)sortDescriptors;
NSSortDescriptor *lastAsc = [NSSortDescriptor sortDescriptorWithKey:@"lastName"
ascending:YES];
NSSortDescriptor *voa = [NSSortDescriptor sortDescriptorWithKey:@"valueOfAssets"
ascending:YES];
NSSortDescriptor *eid = [NSSortDescriptor sortDescriptorWithKey:@"employeeID"
ascending:YES];
[employees sortUsingDexcriptors:@[voa,eid]];
24.5过滤
对Collection进行过滤的时候,程序将对collection对象和一条逻辑语句进行比较,得到一个合成的collection,这个collection只包含满足这条语句的对象。
Foundation中有个NSPredicate的类。NSPredicate对象可以包含一条语句,其运算结果可以为“真”或“假”
-(void)filterUsingPredicate:(NSPredicate *)predicate;
//NSArray有一个名为filteredArrayUsingPredicate:方法,可以创建一个新的数组,能够“满足”传入的NSPredicate对象的对象
-(NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"holder.valueOfAsset>70"];
NSArray *toBeReclaimed = [allAssets filteredArrayUsingPredicate:predicate];
Collection对象与所有权
向Collection对象中加入某个对象是,collection对象会成为该对象的拥有方,如果从collection对象中移除改对象,collection对象就不再是该对象的拥有方了。
C语言基本类型
Collection对象只能保存对象,如果要保存float,int变量或指向结构的指针,则可以先将这些C语言基本类型封装成对象,再存入collection对象。
NSMutableArray *list = [[NSMutableArray alloc]init];
[list addObject:@4];
[list addObject:@5.6];
Collection对象和list
本章所结束的Collectuion对象都不能保存nil,如果要将nil加入。则可以用NSNull类。
[list addObject:[NSNull null]];