NSSet
定义: NSSet是一个无序的,管理多个对象集合类,最大的特点是集合中不允许出现任何重复对象,数组元素是否重复,可根据哈希值判断,如果没有重复的,可以直接将对象放到集合里,如果有哈希值相同的对象,然后利用isEqual判断是否是同一个对象,如果返回值是YES,代表相同,就不存放在集合里,如果返回假,就将对象存放在集合里
用法:
//创建的三种方法: NSSet *set0 = [NSSet setWithObjects:@"one", @"two", @"two", @"three", nil];//集合中不能有重复的内容NSSet *set1 = [NSSet setWithSet:set0]; //生成集合set0的副本set1 NSSet *set2 = [NSSet setWithArray:array];//用数组来生成集合,此处的array是一个含有多个元素的数组 //判断一个集合中,是否包含指定的元素 if ([set2 containsObject:s1] == YES) //contain : 容纳,包含,包括; s1是含有多个元素的数组中的一个元素 { NSLog(@"集合set2中包含对象s1"); } //判断两个集合是否相同 if ([set1 isEqualTo:set2] == NO) //当返回值是YES时,集合set1与set2相等 { NSLog(@"集合set1与set2不相等"); } //判断一个集合是否为另一个集合的子集 if ([set1 isSubsetOfSet:set2] == NO) { NSLog(@"集合set1不是集合set2的子集"); } //将一个集合转换成数组 NSArray *objs = [set2 allObjects]; NSLog(@"%@", objs); //枚举器遍历集合 NSEnumerator *e = [set2 objectEnumerator];//NSEnumerator:枚举器,可以遍历Foundation中的所学的集合元素 TRStudent *s; while (s = [e nextObject]) { NSLog(@"%@", s); } NSEnumerator *e1 = [set1 objectEnumerator]; NSString *str; while (str = [e1 nextObject]) { NSLog(@"%@", str); } hash和isEqual使用方法: -(NSUInteger)hash //大略滤除相同的元素 { return self.age; } -(BOOL)isEqual:(id)object //精细滤除 { if (self == object) return YES; if ([object isMemberOfClass:[TRStudent class]] == YES) //判断他们的类型是否相同,也可以用isKindOfClass; { TRStudent *stu = object;//当类型相同时候,再进行比较里面的属性 if (([self.name isEqualToString:stu.name] == YES) && self.age == stu.age) { return YES; //返回YES表示两个对象重复了 } } return NO; //返回NO表示两个对象不重复 } #pragma mark - NSMutableSet //创建 NSMutableSet *set = [NSMutableSet set];//创建了一个空的集合,有意义的,后面可以向其中添加元素 NSMutableSet *set1 = [NSMutableSet setWithCapacity:18];//Capacity: 容纳能力;创建一个预估空间的集合,目的是加快运行速度 NSMutableSet *set2 = [NSMutableSet setWithObjects:@"one", @"two", @"three", nil];//标准方法 //添加元素 [set addObject:@"one"]; //添加一个元素 NSArray *data = @[@"five", @"six", @"seven"];//简化方法创建一个包含要添加的元素的不可变数组 [set2 addObjectsFromArray:data]; //从数组array中添加多个元素 //删除元素 [set2 removeObject:@"two"]; //删除一个元素 [set2 removeAllObjects]; //一次删除所有元素 //交集 NSMutableSet *set3 = [NSMutableSet setWithObjects:@"one", @"two", @"three", nil]; NSMutableSet *set4 = [NSMutableSet setWithObjects:@"one", @"three", @"four", nil]; [set3 intersectSet:set4]; //intersect :交集,相交 求set3与set4的交集,运算结果被保存在set3中 //并集 NSMutableSet *set5 = [NSMutableSet setWithObjects:@"one", @"two", @"three", nil]; [set5 unionSet:set4]; //将运算结果放入set5中 //删除多个元素 [set5 minusSet:set3]; //从set5中删除set3中的所有元素
NSDictionary:
定义: 不可变字典,由键-值对组合的集合,key-value,痛过key键得到相应的value值;
key通常是字符类型,key值不允许重复,value则可以;
TRStudent *stu1 = [[TRStudent alloc] initWithName:@"zhangsan" andAge:18]; TRStudent *stu2 = [[TRStudent alloc] initWithName:@"lisi" andAge:22]; TRStudent *stu3 = [[TRStudent alloc] initWithName:@"wangwu" andAge:20]; //字典的创建: NSDictionary *dict1 = [NSDictionary dictionaryWithObjectsAndKeys:stu1, @"1", stu2, @"2", stu3, @"3", stu1, @"4", nil];//①标准创建 NSDictionary *dict2 = @{@"1":stu1, @"2": stu2, @"3":stu3};//④字典创建的简化方法 NSArray *objects = @[stu1,stu2]; NSArray *keys = @[@"1",@"2"]; NSDictionary *sict2 = [NSDictionary dictionaryWithObjects:objects forKeys:keys];//②数组创建 NSDictionary *dict3 = [NSDictionary dictionaryWithDictionary:dict1];//③复制创建 //获取字典中的所有关键字: NSArray *keys = [dict1 allKeys];//获取多有key值 NSLog(@"%@", keys); //获取字典中的所有值的内容 NSArray *values = [dict1 allValues]; //根据关键字,求相应的值的内容 NSLog(@"%@", [dict1 objectForKey:@"1"]); NSLog(@"%@", [dict1 valueForKey:@"1"]); //根据值的内容,求相应的关键字 NSArray *keys1 = [dict1 allKeysForObject:stu1];//由于可以重复,所以可能会有多个关键字对应同一个值,所以该方法的返回值是一个数组 //根据多个key找多个value NSArray *keys2 = @[@"1", @"5"]; NSArray *values1 = [dict1 objectsForKeys:keys2 notFoundMarker:@"no-found"];//key值对应的value没有找到,则输出no-found NSLog(@"%@", values1); //简化的通过key找到value NSLog(@"%@", dict2[@"1"]); #pragma mark -四种遍历: //普通遍历 NSArray *keys3 = [dict2 allKeys]; for (int i = 0; i < [keys3 count]; i++) { NSLog(@"%@ = %@", keys3[i], dict2[keys3[i]]); } //枚举器:所有value NSEnumerator *e1 = [dict2 objectEnumerator]; TRStudent *stu; while(stu = [e1 nextObject]) { NSLog(@"%@", stu); } //枚举器:所有key NSEnumerator *e2 = [dict2 keyEnumerator]; NSString *key; while(key = [e2 nextObject]) { NSLog(@"%@", key); } //快速:只能遍历key for (NSString *key in dict2) { NSLog(@"%@=%@", key, dict2[key]); } //将字典的内容写入文件 NSDictionary *dict3 = [NSDictionary dictionaryWithObjectsAndKeys:@"string1", @"1", @"string2", @"2", @"string3", @"3", nil]; [dict3 writeToFile:@“目标文件绝对地址” atomically:YES]; //导出文件 //用文件中的内容生成字典 NSDictionary *dict4 = [NSDictionary dictionaryWithContentsOfFile:@"/Users/tarena/Desktop/dict.plist"];//导入文件
NSMutableDictionary
定 义: 可修改字典,是NSDictionary的子类
//创建方法 NSMutableDictionary *dict = [NSMutableDictionary dictionary];//①创建一个空字典,有意义的,在后面可以向字典中添加键值对 NSMutableDictionary *dict1 = [NSMutableDictionary dictionaryWithCapacity:18];//②预估值 NSMutableDictionary *dict2 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"one", @"1", @"two", @"2", nil];//③标准方法 //添加方法 [dict2 setValue:@"three" forKey:@"3"]; //添加一个键值对 NSMutableDictionary *dict3 = [NSMutableDictionary dictionary]; [dict3 addEntriesFromDictionary:dict2]; //将一个字典中的键值对,放入另一个字典中 //覆盖:替换 NSDictionary *dict4 = [NSDictionary dictionaryWithObjectsAndKeys:@"aaa", @"1", @"bbb", @"2", @"ccc", @"3", nil]; [dict3 setDictionary:dict4]; //用dict4中的所有键值对,替换dict3中的所有键值对 //删除 [dict3 removeObjectForKey:@"1"]; //根据key来删除一个键值对 NSArray *keys = @[@"2", @"3"]; [dict3 removeObjectsForKeys:keys]; //根据key数组删除多个键值对 NSLog(@"%lu", [dict3 count]); [dict3 removeAllObjects]; //清除字典中的所有键值对
判断某个类或对象包括某个方法或遵守某个协议
Protocol *p = @protocol(NSCopying);//生成协议选择器! 关键字:@protocol:协议 if ([TRStudent conformsToProtocol:p]==YES) /**conform:遵守 判断类是否遵守了NSCopying协议 */ //if ([TRStudent conformsToProtocol:@protocol(NSCopying)]==YES) 上面的等同于这句话 { TRStudent *student1 = [student copy];//此处为深拷贝 [student1 study]; }
方法选择器:
SEL sel = @selector(study);//生成一个方法选择器,所有类里定义的方法! 关键字:@selector:选择器 //上面这句中:SEL是方法的类型,sel是方法的变量 if ([TRStudent instancesRespondToSelector:sel] == YES) //instance :情况,例子 { NSLog(@"类TRStudent中 存在 study方法"); } else { NSLog(@"类TRStudent中 不存在 study方法"); }
Runtime
存在意义: Objective-C语言中,许多工作是在运行时执行的,用Runtime在运行系统时来执行编译后的代码
Block
定 义: Block封装一段代码,可以在任何时候执行,Block可作为函数的参数或者返回值,而本身又可以带输入参数或返回值,与传统函数指针相类似,但是绝对不是函数; 函数是不允许嵌套定义的,也就是不允许在函数的定义里再去定义一个函数.
block可以在函数的定义里定义;