二、NSMutableString
176.NSMutableString
1). 是Foundation框架中的一個類,從NSString繼承,是用來存儲字符串?dāng)?shù)據(jù)的.
2). NSMutableString在父類NSString的基礎(chǔ)之上做擴展,
存儲在NSMutableString對象中的數(shù)據(jù)具有可變性,不會新創(chuàng)建對象.
177. NSMutableString的用法
1). 創(chuàng)建對象:
NSMutableString *str = [NSMutableString string];
[str appendString:@"jack"]; // 追加字符串。
2). 往可變字符串對象中追加字符串:
(void)appendString:(NSString *)aString;// 直接追加內(nèi)容
(void)appendFormat:(NSString *)format...;// 以拼接的方式往可變字符串對象中追加內(nèi)容
3). 創(chuàng)建NSMutableString對象時,不能使用如下方式:
NSMutableString *str = @"jack";
4). NSMutableString做大批量的字符串拼接,速度快,因為NSMutableString只有一個,每次修改的時候直接修改對象的內(nèi)容。
NSMutableString是從NSString繼承,在使用NSString的地方,完全可以使用NSMutableString。
6. 使用建議
1). 平時使用,還是使用NSString,因為效率高。
第二次使用同1個字符串,不需要再創(chuàng)建,可直接使用。
NSString *str1 = @"jack";
NSString *str2 = @"jack";
2). 大批量的數(shù)據(jù)拼接的時候使用NSMutableString
10次以上使用NSMutableString. 此時NSString拼接,效率低下。
178. NSArray的用法
1. NSArray,具備數(shù)組功能。是OC中的數(shù)組。
1). 是Foundation框架中的一個類,用來存儲多個數(shù)據(jù),具備數(shù)組功能,所以NSArray是OC中的數(shù)組
2). NSArray的特點:
a. 只能存儲OC對象
b. 長度固定, 一旦NSArray數(shù)組創(chuàng)建完畢之后,元素的長度固定,無法新增、刪除元素.
c. 每一個元素都是緊密相連的,每一個元素仍然有自己的下標(biāo).
d. 元素的類型是id類型的.只能存OC對象類型。
3). NSArray數(shù)組的創(chuàng)建:
1). 因為是一個類,所以就是創(chuàng)建NSArray對象.
NSArray *arr1 = [NSArray new];
NSArray *arr2 = [[NSArray alloc] init];
NSArray *arr3 = [NSArray array];
這樣創(chuàng)建出來的NSArray數(shù)組的元素的個數(shù)是0個,因為長度固定,所以沒有任何意義.
2). 創(chuàng)建數(shù)組的同時指定一個數(shù)組的元素,仍然沒有意義
NSArray *arr1 = [NSArray arrayWithObject:@"jack"];
3). 最常用創(chuàng)建NSArray數(shù)組的方式.
- (instancetype)arrayWithObjects:(ObjectType)firstObj,...
NSArray *arr1 = [NSArray arrayWithObjects:@"jack",@"rose",@"lili",nil];
4). 創(chuàng)建NSArray簡要方式
NSArray *arr = @[@"jack", @"rose", @"lili"];
5). 使用注意
a. 只能存儲OC對象,不能存儲非OC對象
b. 將元素寫完之后,最后要寫一個nil,表示元素到此結(jié)束了
179. NSArray的用法
- 在NSLog函數(shù)中使用%@可以直接輸出 NSArray對象中的所有元素的值。
- NSArray數(shù)組中不能存儲基本數(shù)據(jù)類型。不能存儲非OC對象。
nil的本質(zhì)其實就是0,所以nil無法存儲到NSArray數(shù)組中。 - 可以通過下標(biāo)index,取出數(shù)組中的值。
- 得到數(shù)組中元素的個數(shù):arr.count;
- 判斷數(shù)組中是否有指定元素:[arr containsObject:@"lily"];
- 第一個元素:arr.firstObject
- 最后元素:arr.lastObject
- 查找數(shù)組中第一次出現(xiàn)item的下標(biāo)。
indexOfObject,如果沒找到,返回的是NSUInteger的最大值。
180. NSArray的用法
NSArray數(shù)組的編譯
1). for循環(huán)
原理: 將下標(biāo)挨個遍歷出來
NSArray *arr = @[@"jack",@"rose"];
for(int i=0;i<arr.count;i++){
//NSLog(@"%@",arr[i]);
NSLog(@"%@", [arr objectAtIndex:i]);
}
2). 使用增強for循環(huán)
a. 語法格式:
for(元素類型 變量名 in 數(shù)組名){
直接通過變量名拿到數(shù)組中的每一個元素
}
NSArray *arr = @[@"jack",@"rose"];
for(NSString *str in arr){
NSLog(@"%@", str);
}
b. 聲明在for()中的變量叫做迭代變量
c. 執(zhí)行變量
將數(shù)組中的第一個元素的值賦值給迭代變量,執(zhí)行循環(huán)體
...
結(jié)束循環(huán)
d. 語法總結(jié)
-> 迭代變量的類型和數(shù)組中的元素的類型保持一致
-> 迭代變量的名稱可以任意取
-> in是固定的
-> 遍歷那個數(shù)組就將數(shù)組寫在in后面
-> 循環(huán)體里面,迭代變量的值就是元素的值
當(dāng)NSArray數(shù)組中存儲的數(shù)據(jù)類型不一致的時候,迭代變量的類型建議使用id類型
3). 使用block遍歷:enumerateObjectsUsingBlock
(void) enumerateObjectsUsingBlock:(void (^)OjbectType obj, NSUInteger idx, BOOL *stop))block;
idx:是每個元素的下標(biāo)index。
obj:代表遍歷出來的元素的值。
*stop:是否繼續(xù)遍歷的標(biāo)志,YES停止,NO不停止。
這是一個方法,這個方法作用來遍歷數(shù)組中的每一個元素
NSArray *arr = @[@"jack",@"rose"];
// 將arr數(shù)組中的每一個元素遍歷出來
[arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop){
NSLog(@"%@", obj);
// 如果想停止循環(huán),就將*stop設(shè)置為YES
}];
NSArray和NSString 的方法。
1). 將數(shù)組中元素連接起來組成一個新的字符串
(NSString *)componentsJoinedByString:(NSString *)separator
參數(shù): 連接符
NSArray *arr = @[@"jack", @"rose", @"lili"];
NSString *str = [arr componentsJoinedByString:@"#"];
2). 將字符串按指定分隔符分割
NSString *str = @"北京,昌平區(qū),傳智";
// 使用字符串進行分割
NSArray *arr = [str componentsSeparatedByString:","];
NSMutableArray是NSArray的子類
1). NSMutableArray仍然是一個數(shù)組,就被NSArray的特點,只能存儲OC對象,每一個元素是緊密相連的。
2). NSMutableArray相對于父類做的擴展,NSMutableArray數(shù)組的元素可以動態(tài)的新增和刪除,其他用法與NSArray一致。
所以:
NSArray數(shù)組一旦創(chuàng)建,其元素的個數(shù)就固定,無法新增與刪除
NSMutableArray數(shù)組,可以新增刪除.
3). NSMutableArray數(shù)組的創(chuàng)建
NSMutableArray *arr1 = [NSMutableArray new];
NSMutableArray *arr2 = [[NSMutableArray alloc] init];
NSMutableArray *arr3 = [NSMutableArray array];
NSMutableArray *arr4 = [NSMutableArray arrayWithObjects:@"jack", @"rose", @"lili", nil];
這樣創(chuàng)建出來的數(shù)組對象,數(shù)組的元素是0,但是有意義,可以動態(tài)的新增,刪除.
最容易犯錯:這樣寫不可以. 這時NSArray對象的簡寫。
NSMutableArray *arr1 = @[@"jack", @"rose", @"lili"];
新增與刪除
新增
a. // 將傳入的參數(shù)作為數(shù)組的元素添加進去
- (void)addObject:(ObjectType)anObject;
// 將另外一個數(shù)組中的每一個元素添加到可變數(shù)組中
- (void)addObjectsFromArray:(NSArray<ObjectType> *)otherArray;
NSMutableArray *arr1 = [NSMutableArray new];
[arr1 addObject:@"jack"];
NSArray *arr = @[@"jack", @"rose", @"lili"];
[arr1 addObjectsFromArray:arr];
b. 在可變數(shù)組中指定的數(shù)組中插入一個元素
- (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index;
[arr insertObject:@"lilei", atIndex:1]; // 可變數(shù)組的中間,插入元素
刪除
a. 刪除
// 刪除指定下標(biāo)的元素
- (void) removeObjectAtIndex:(NSUInteger)index;
NSMutableArray *arr1 = [NSMutableArray new];
[arr1 addObject:@"jack"];
NSArray *arr = @[@"jack", @"rose", @"lili"];
[arr1 addObjectsFromArray:arr];
[arr removeObjectAtIndex:1];
b. 刪除特定的元素
- (void)removeObject:(ObjectType)anObject;
NSMutableArray *arr1 = [NSMutableArray new];
[arr1 addObject:@"jack"];
NSArray *arr = @[@"jack", @"rose", @"lili"];
[arr1 addObjectsFromArray:arr];
[arr removeObject:@"lili"];
c. 刪除指定范圍內(nèi)的元素
- (void)removeObject:(ObjectType)anObject inRange:(NSRange)range;
NSMutableArray *arr1 = [NSMutableArray new];
[arr1 addObject:@"jack"];
NSArray *arr = @[@"jack", @"rose", @"lili"];
[arr1 addObjectsFromArray:arr];
[arr removeObject:@"lili" inRange:NSMakeRange(0, 3)];
d. 刪除最后一個元素
- (void)removeLastObject;
NSMutableArray *arr1 = [NSMutableArray new];
[arr1 addObject:@"jack"];
NSArray *arr = @[@"jack", @"rose", @"lili"];
[arr1 addObjectsFromArray:arr];
[arr removeLastObject];
e. 刪除所有
- (void)removeAllObjects;
NSMutableArray *arr1 = [NSMutableArray new];
[arr1 addObject:@"jack"];
NSArray *arr = @[@"jack", @"rose", @"lili"];
[arr1 addObjectsFromArray:arr];
[arr removeAllObjects];
183. NSNumber
無論是NSArray還是NSMutableArray,里面只能存儲OC對象?;緮?shù)據(jù)類型是無法存儲的。
解決方案:先用一個OC對象,將基本數(shù)據(jù)類型包裝,再將這個對象放到NSArray中。
NSNumber
1). 作用: 包裝基本數(shù)據(jù)類型.
NSNumber *number = [NSNumber numberWithInt:10];
等價于
NSNumber *number = @10; // 簡寫方式。
// @10: 代表是1個NSNumber獨享,這個對象中包裝的是整型的10.
NSLog(@"%d", number.intValue); // 從NSNumber中取值。
注意:如果后面的數(shù)據(jù)是1個變量,這個變量就必須使用小括號括起來。
int num =10;
NSNumber *number = @(num);