NS类(NSArray、NSString、NSDictionar
一.数组 NSArray与NSMutableArray
-
数组只能存放OC对象,基本数据类型需要加入时需要封装为NSNumber类型 数组分为不可变数组NSArray 与可变数组NSMutableArray 创建不可变数组时使用copy修饰
-
不可变数组在初始化时可先指定内存空间
-
不可变数组NSArray在创建后变不可增加、删除元素
-
可变数组的增删改插
①. 增//添加一个元素 [array addObject:ppp]; //添加多个元素[array addObjectsFromArray:@[aaa,bb,ccc]]
②. 插[array insertObject:@"Two" atIndex:1];
③. 改//替换元素 [array replaceObjectAtIndex:0 withObject:@"1"]; //交换元素 [array exchangeObjectAtIndex:1 withObjectAtIndex:2];
④. 删//删除所有元素 [array removeAllObject] //删除指定元素 [array removeObject:ppp] //删除指定下标元素[array removeObjectAtIndex:1] //删除最后一个元素[array removeLastObject]
-
获取数组某元素在数组中的位置
NSUInteger index = [array1 indexOfObject:@"abcde"];
-
获取第一个/最后一个元素
NSString * str2 =[array1 firstObject]; NSString * str3 = [array1 lastObject];
-
判断数组是否包含某个元素
BOOL tag = [array containsObject:@"Five"];
-
将数组的元素进行拼接
// 只对字符串对象操作 NSString * str4 = [array componentsJoinedByString:@"poi"];poi为分割字符
-
将string字符转换为array数组
NSString *tempString = [mutableArray componentsJoinedByString:@","];--分隔符
-
数组的遍历
for (NSInteger i = 0; i < [arr count]; i++) {
NSLog(@"arr[%ld] = %@",i,arr[i]);
}
//快速枚举法(快速遍历)
for (id arr2Q in arr2) {
NSLog(@"arr2Q = %@",arr2Q);
}
[arrayM enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%zd--%@",idx,obj);
}];
二.集合 NSSet、NSMutableSet、NSCountedSet、NSOrderedSet、NSMutableOrderedSet
原文链接 原文有更详细的解释
-
NSSet:集合。是NSObject的子类,跟NSArray不一样在于,NSArray的元素是有序的,可以通过索引访问,而NSSet的元素是无序的,不能通过索引访问;NSArray的元素可以是重复的,而NSSet的元素不能重复,同一个元素只能有一个。
-
NSMutableSet:可变集合。是NSSet的子类,跟NSSet不一样的地方在于NSMutableSet的元素是可以修改的,可以增加删除替换等操作。
-
NSCountedSet:可计数集合。是NSMutableSet的子类,跟NSMutableSet不一样的地方在于,它的元素有个计数功能,添加同一个元素两次后该元素的计数为2,但是元素只能有一个不能重复,删除该元素的时候,当该元素的计数为0时删除它。
-
NSOrderedSet:有序集合。是NSObject的子类,跟NSSet不一样的地方在于,它的元素是有序的,可以通过索引访问,当然元素也不可重复出现。
-
NSMutableOrderedSet:有序可变集合。是NSOrderedSet的子类,跟NSOrderedSet不一样的地方在于,它的元素可以增删替换等操作。
-
无序集合的元素是无序且不重复的,在内存中存储的方式是不连续的。数组是有序的,在内存中的存储位置是连续的
-
无序集合与数组的优劣:无序集合在搜索一个一个的元素时效率比数组高,因为他使用了hash算法可以直接找到元素存储的位置,而数组则需要遍历整个数组效率较低;
三.字典 NSDictionary与NSMutableDictionary
- 字典是无序的,键值对不分前后
- 获取字典中所有的键
NSArray *array = dic1.allKeys; // [dic1 allKeys]
- 获取字典中所有的值
NSArray *array2 = [dic1 allValues]; // dic1.allValues
- 可变字典使用语法糖创建
NSMutableDictionary *dic3 = [@{@"name" : @"luigi", @"sex" : @"man", @"old" : @"18"} mutableCopy];
- 字典的遍历 可用于根据value获取对应的key
[dict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
NSLog(@"%@:%@",key,obj);
//设置*stop = YES;可停止遍历
}];
四. 字符串 NSString与NSMutableString
- 字符串的比较
BOOL result = [str isEqualToString:str2];
- 不考虑大小写比较字符串
int result = [str caseInsensitiveCompare:str2];
- 比较两个字符串的大小
int result = [str compare:str2];
- 获取长度
NSInteger len = str.length;
- 大小写转换
//转成大写strUp = [str uppercaseString]; //转成小写strLo = [str lowercaseString]; //首字母大写其他小写str2 = [str capitalizedString];
- 字符串的截取
①. 从开始位置截取到5(不包括5)NSString *newStr = [str substringToIndex:5];
②. 从5开始截取到尾部(包括5)NSString *newStr = [str substringFromIndex:5];
③. 截取指定范围的字符串NSRange range = {1,5}; stringnews = [string21 substringWithRange:range];
- 字符串的追加
NSString *newStr = [str stringByAppendingString:@"adhs"];NSString *newStr = [str stringByAppendingFormat:@"%@",@"asda"];
- 字符串的查找
NSRange rang = [string23 rangeOfString:@"ios"];//返回一个范围 rang.location == NSNotFound为没有查询到否则即查询成功
- 取出字符串中指定的char
unichar c = [str characterAtIndex:5];
- 可变字符串的插入与追加
//插入[string1 insertString:@"可变" atIndex:0];//追加[string1 appendString:@"可变"];
- 删除或替换字符串内容
//先查找出需要替换的字符串范围NSRanger ranges = [str rangeOfString:@"ios"]; //删除[str deleteCharactersInRange:range];//替换[str replaceCharactersInRange:ranges withString:@"ee"];
五.NSData
基本概念:NSData是用来包装数据的。NSData存储的是二进制数据,屏蔽了数据之间的差异,文本、音频、图像等数据都可用NSData来存储
-
NSData与NSString的转换
//str转data NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; //data转str NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
-
NSData与UIImage
//data转image UIImage *image = [UIImage imageWithData:imageData]; //将指定路径的图片转为data NSData *imageData = [NSData dataWithContentsOfFile:filePath];
-
NSData与NSArray、NSDictionary
//归档与解档
//归档(XXX代表任意对象遵循<NSCoding>协议) XXX转为NSData
id XXX;
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:XXX];
[data writeToFile:[Utils applicationDocumentsDirectory:kCollectFilePath] atomically:YES];
//解档
id XXX= [NSKeyedUnarchiver unarchiveObjectWithData:[NSData dataWithContentsOfFile:[Utils applicationDocumentsDirectory:kCollectFilePath]]];
其余NSData相关将在数据持久化篇复习
六.NSTimer计时器
文章转载NSTimer
[NSTimer scheduledTimerWithTimeInterval:1 target:testObject2 selector:@selector(timerAction:) userInfo:nil repeats:YES];
- 什么是NSTimer
官方给出解释是“A timer provides a way to perform a delayed action or a periodic action. The timer waits until a certain time interval has elapsed and then fires, sending a specified message to a specified object. ” 翻译过来就是timer就是一个能在从现在开始的后面的某一个时刻或者周期性的执行我们指定的方法的对象。 - timer会对它的target进行retain,我们需要谨慎对待这个target的生命周期问题,尤其是重复性的timer。(NSTimer初始化后,self的retainCount加1.那么,我们需要在释放这个类之前,执行[timer invalidate];否则,不会执行该类的dealloc方法。在viewDidDisappear中调用[timer invalidate])
- timer并不总是准时触发,timer不是一种实时的机制,会存在延迟,而且延迟的程度跟当前线程的执行情况有关。
假设你添加了一个timer指定2秒后触发某一个事件,但是恰好那个时候当前线程在执行一个连续运算(例如大数据块的处理等),这个时候timer就会延迟到该连续运算执行完以后才会执行。重复性的timer遇到这种情况,如果延迟超过了一个周期,则会和后面的触发进行合并,即在一个周期内只会触发一次。但是不管该timer的触发时间延迟的有多离谱,他后面的timer的触发时间总是倍数于第一次添加timer的间隙。 - 必须得把timer添加到runloop中,它才会生效。
NSTimer *timer = [[NSTimer alloc] initWithFireDate:[NSDate dateWithTimeIntervalSinceNow:1] interval:1 target:testObject3 selector:@selector(timerAction:) userInfo:nil repeats:NO]; [testObject3 release]; //添加到runloop [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
七.NSEnumerator 迭代器
- 迭代器
NSArray *arr = [NSArray arrayWithObjects:@"bei", @"jing", @"huan", @"ying", @"nin", nil];
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];
// 创建数组 正序 迭代器
NSEnumerator *arrEnumer1 = [arr objectEnumerator];
// 创建数组 反序 迭代器
NSEnumerator *arrEnumer2 = [arr reverseObjectEnumerator];
// 创建字典 key 迭代器
NSEnumerator *dicKeyEnumer = [dic keyEnumerator];
// 创建字典 对象 迭代器
NSEnumerator *dicObjEnumer = [dic objectEnumerator];
// 获取迭代器中下一个对象
id obj = [arrEnumer1 nextObject];
// 获取迭代器中所有对象
NSArray *array = [arrEnumer2 allObjects];
- 数组用迭代器遍历
NSArray *array = [NSArray arrayWithObjects:@"bei", @"jing", @"huan", @"ying", @"nin", nil];
// 获取数组的正序迭代器
NSEnumerator *enu1 = [array objectEnumerator];
// 获取数组的反序迭代器
NSEnumerator *enu2 = [array reverseObjectEnumerator];
// 遍历数组
id obj = nil;
// 正序,获取下一个需要遍历的元素
while (obj = [enu1 nextObject]) {
NSLog(@"%@", obj);
}
// 反序,获取下一个需要遍历的元素
while (obj = [enu2 nextObject]) {
NSLog(@"%@", obj);
}
- 集合用迭代器遍历
NSSet *set = [NSSet setWithObjects:@5, @23, @3, @8, @21, @33, @18, nil];
NSEnumerator *enu = [set objectEnumerator];
id obj = nil;
while (obj = [enu nextObject]) {
NSLog(@"%@", obj);
}
- 字典用迭代器遍历
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];
// key 迭代器
NSEnumerator *keyEnumer = [dic keyEnumerator];
id key = nil;
while (key = [keyEnumer nextObject]) {
NSLog(@"%@ = %@", key, [dic objectForKey:key]);
}
// 对象迭代器
NSEnumerator *objEnumer = [dic objectEnumerator];
id obj = nil;
while (obj = [objEnumer nextObject]) {
NSLog(@"%@", obj);
}