一.數(shù)組 NSArray與NSMutableArray
數(shù)組只能存放OC對象,基本數(shù)據(jù)類型需要加入時(shí)需要封裝為NSNumber類型 數(shù)組分為不可變數(shù)組NSArray 與可變數(shù)組NSMutableArray 創(chuàng)建不可變數(shù)組時(shí)使用copy修飾
不可變數(shù)組在初始化時(shí)可先指定內(nèi)存空間
不可變數(shù)組NSArray在創(chuàng)建后變不可增加娜饵、刪除元素
可變數(shù)組的增刪改插
①. 增//添加一個(gè)元素 [array addObject:ppp]; //添加多個(gè)元素[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] //刪除指定下標(biāo)元素[array removeObjectAtIndex:1] //刪除最后一個(gè)元素[array removeLastObject]
獲取數(shù)組某元素在數(shù)組中的位置
NSUInteger index = [array1 indexOfObject:@"abcde"];
獲取第一個(gè)/最后一個(gè)元素
NSString * str2 =[array1 firstObject]; NSString * str3 = [array1 lastObject];
判斷數(shù)組是否包含某個(gè)元素
BOOL tag = [array containsObject:@"Five"];
將數(shù)組的元素進(jìn)行拼接
// 只對字符串對象操作 NSString * str4 = [array componentsJoinedByString:@"poi"];poi為分割字符
將string字符轉(zhuǎn)換為array數(shù)組
NSString *tempString = [mutableArray componentsJoinedByString:@","];--分隔符
數(shù)組的遍歷
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
原文鏈接 原文有更詳細(xì)的解釋
NSSet:集合钧萍。是NSObject的子類,跟NSArray不一樣在于政鼠,NSArray的元素是有序的风瘦,可以通過索引訪問,而NSSet的元素是無序的公般,不能通過索引訪問万搔;NSArray的元素可以是重復(fù)的,而NSSet的元素不能重復(fù)官帘,同一個(gè)元素只能有一個(gè)瞬雹。
NSMutableSet:可變集合。是NSSet的子類刽虹,跟NSSet不一樣的地方在于NSMutableSet的元素是可以修改的酗捌,可以增加刪除替換等操作。
NSCountedSet:可計(jì)數(shù)集合涌哲。是NSMutableSet的子類胖缤,跟NSMutableSet不一樣的地方在于,它的元素有個(gè)計(jì)數(shù)功能阀圾,添加同一個(gè)元素兩次后該元素的計(jì)數(shù)為2哪廓,但是元素只能有一個(gè)不能重復(fù),刪除該元素的時(shí)候初烘,當(dāng)該元素的計(jì)數(shù)為0時(shí)刪除它涡真。
NSOrderedSet:有序集合。是NSObject的子類肾筐,跟NSSet不一樣的地方在于哆料,它的元素是有序的,可以通過索引訪問局齿,當(dāng)然元素也不可重復(fù)出現(xiàn)剧劝。
NSMutableOrderedSet:有序可變集合。是NSOrderedSet的子類抓歼,跟NSOrderedSet不一樣的地方在于讥此,它的元素可以增刪替換等操作。
無序集合的元素是無序且不重復(fù)的谣妻,在內(nèi)存中存儲的方式是不連續(xù)的萄喳。數(shù)組是有序的,在內(nèi)存中的存儲位置是連續(xù)的
無序集合與數(shù)組的優(yōu)劣:無序集合在搜索一個(gè)一個(gè)的元素時(shí)效率比數(shù)組高蹋半,因?yàn)樗褂昧薶ash算法可以直接找到元素存儲的位置他巨,而數(shù)組則需要遍歷整個(gè)數(shù)組效率較低;
三.字典 NSDictionary與NSMutableDictionary
- 字典是無序的,鍵值對不分前后
- 獲取字典中所有的鍵
NSArray *array = dic1.allKeys; // [dic1 allKeys]
- 獲取字典中所有的值
NSArray *array2 = [dic1 allValues]; // dic1.allValues
- 可變字典使用語法糖創(chuàng)建
NSMutableDictionary *dic3 = [@{@"name" : @"luigi", @"sex" : @"man", @"old" : @"18"} mutableCopy];
- 字典的遍歷 可用于根據(jù)value獲取對應(yīng)的key
[dict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
NSLog(@"%@:%@",key,obj);
//設(shè)置*stop = YES染突;可停止遍歷
}];
四. 字符串 NSString與NSMutableString
- 字符串的比較
BOOL result = [str isEqualToString:str2];
- 不考慮大小寫比較字符串
int result = [str caseInsensitiveCompare:str2];
- 比較兩個(gè)字符串的大小
int result = [str compare:str2];
- 獲取長度
NSInteger len = str.length;
- 大小寫轉(zhuǎn)換
//轉(zhuǎn)成大寫strUp = [str uppercaseString]; //轉(zhuǎn)成小寫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"];//返回一個(gè)范圍 rang.location == NSNotFound為沒有查詢到否則即查詢成功
- 取出字符串中指定的char
unichar c = [str characterAtIndex:5];
- 可變字符串的插入與追加
//插入[string1 insertString:@"可變" atIndex:0];//追加[string1 appendString:@"可變"];
- 刪除或替換字符串內(nèi)容
//先查找出需要替換的字符串范圍NSRanger ranges = [str rangeOfString:@"ios"]; //刪除[str deleteCharactersInRange:range];//替換[str replaceCharactersInRange:ranges withString:@"ee"];
五.NSData
基本概念:NSData是用來包裝數(shù)據(jù)的捻爷。NSData存儲的是二進(jìn)制數(shù)據(jù),屏蔽了數(shù)據(jù)之間的差異份企,文本也榄、音頻、圖像等數(shù)據(jù)都可用NSData來存儲
NSData與NSString的轉(zhuǎn)換
//str轉(zhuǎn)data NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; //data轉(zhuǎn)str NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSData與UIImage
//data轉(zhuǎn)image UIImage *image = [UIImage imageWithData:imageData]; //將指定路徑的圖片轉(zhuǎn)為data NSData *imageData = [NSData dataWithContentsOfFile:filePath];
NSData與NSArray司志、NSDictionary
//歸檔與解檔
//歸檔(XXX代表任意對象遵循<NSCoding>協(xié)議) XXX轉(zhuǎn)為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相關(guān)將在數(shù)據(jù)持久化篇復(fù)習(xí)
六.NSTimer計(jì)時(shí)器
文章轉(zhuǎn)載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就是一個(gè)能在從現(xiàn)在開始的后面的某一個(gè)時(shí)刻或者周期性的執(zhí)行我們指定的方法的對象甜紫。 - timer會對它的target進(jìn)行retain,我們需要謹(jǐn)慎對待這個(gè)target的生命周期問題骂远,尤其是重復(fù)性的timer囚霸。(NSTimer初始化后,self的retainCount加1.那么激才,我們需要在釋放這個(gè)類之前拓型,執(zhí)行[timer invalidate];否則,不會執(zhí)行該類的dealloc方法瘸恼。在viewDidDisappear中調(diào)用[timer invalidate])
- timer并不總是準(zhǔn)時(shí)觸發(fā)吨述,timer不是一種實(shí)時(shí)的機(jī)制,會存在延遲钞脂,而且延遲的程度跟當(dāng)前線程的執(zhí)行情況有關(guān)。
假設(shè)你添加了一個(gè)timer指定2秒后觸發(fā)某一個(gè)事件捕儒,但是恰好那個(gè)時(shí)候當(dāng)前線程在執(zhí)行一個(gè)連續(xù)運(yùn)算(例如大數(shù)據(jù)塊的處理等)冰啃,這個(gè)時(shí)候timer就會延遲到該連續(xù)運(yùn)算執(zhí)行完以后才會執(zhí)行。重復(fù)性的timer遇到這種情況刘莹,如果延遲超過了一個(gè)周期阎毅,則會和后面的觸發(fā)進(jìn)行合并,即在一個(gè)周期內(nèi)只會觸發(fā)一次点弯。但是不管該timer的觸發(fā)時(shí)間延遲的有多離譜扇调,他后面的timer的觸發(fā)時(shí)間總是倍數(shù)于第一次添加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];
// 創(chuàng)建數(shù)組 正序 迭代器
NSEnumerator *arrEnumer1 = [arr objectEnumerator];
// 創(chuàng)建數(shù)組 反序 迭代器
NSEnumerator *arrEnumer2 = [arr reverseObjectEnumerator];
// 創(chuàng)建字典 key 迭代器
NSEnumerator *dicKeyEnumer = [dic keyEnumerator];
// 創(chuàng)建字典 對象 迭代器
NSEnumerator *dicObjEnumer = [dic objectEnumerator];
// 獲取迭代器中下一個(gè)對象
id obj = [arrEnumer1 nextObject];
// 獲取迭代器中所有對象
NSArray *array = [arrEnumer2 allObjects];
- 數(shù)組用迭代器遍歷
NSArray *array = [NSArray arrayWithObjects:@"bei", @"jing", @"huan", @"ying", @"nin", nil];
// 獲取數(shù)組的正序迭代器
NSEnumerator *enu1 = [array objectEnumerator];
// 獲取數(shù)組的反序迭代器
NSEnumerator *enu2 = [array reverseObjectEnumerator];
// 遍歷數(shù)組
id obj = nil;
// 正序,獲取下一個(gè)需要遍歷的元素
while (obj = [enu1 nextObject]) {
NSLog(@"%@", obj);
}
// 反序捡絮,獲取下一個(gè)需要遍歷的元素
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);
}