一茅姜、
-
框架: 系統(tǒng)或者第三方事先寫好的寫很牛X功能的類,把這些類交給我們使用月匣,這些類的集合就叫框架.
Foundation框架: 是一個包钻洒,有很多類和函數(shù),定義了一些數(shù)據(jù)類型.這個框架中的類都是一些最基礎(chǔ)的類.其他的框架都是基于Foundation框架的.UIKit.
AVFoundation.
...... NSString
1). NSString是一個數(shù)據(jù)類型桶错,保存OC字符串.
NSString的本質(zhì)是一個類.
最標準的創(chuàng)建NSString對象的方法:
NSString *str1 = [NSString new]; NSString *str2 = [[NSString alloc] init]; NSString *str3 = [NSString string];
使用這種方式創(chuàng)建的字符串是一個空的字符. @""
NSString 對象是用來存儲字符串的.
2). NSString是OC中最常用的一個類航唆,所以O(shè)C提供了一種更為快速的創(chuàng)建字符串對象的方式.
使用前綴@
@"jack": 本質(zhì)是一個NSString對象胀蛮,存儲的是"jack"這個字符串
NSString *str1 = @"rose";
a. @"rose"本質(zhì)是一個NSString對象院刁,存儲的是字符串"rose"
b. 將這個字符串對象的地址返回賦值給str1指針
格式控制符%p: 打印指針變量的值,打印地址
格式控制符%@: 打印指針指向的對象-
NSString對象的恒定性
1). 當(dāng)我們使用簡要的創(chuàng)建字符串對象的時候粪狼,也就是使用OC字符串常量來初始化字符串指針的時候退腥,這個字符串對象是存儲在常量區(qū)的.
NSString *str = @"jack";
當(dāng)我們調(diào)用NSString的類方法來創(chuàng)建對象的時候, 創(chuàng)建的對象是存儲在堆區(qū)的.
NSString *str = [NSString stringWithFormat:@"jack"];
NSString *str = [NSString new];2). 恒定性
當(dāng)在內(nèi)存中創(chuàng)建一個字符串對象后,這個字符串對象的內(nèi)容就無法更改.
當(dāng)我們重新為字符串指針初始化值的時候再榄,并不是修改原來的字符串對象狡刘,而是重新的創(chuàng)建一個字符串對象,將這個字符串對象的地址重新賦值給字符串指針變量.3). 當(dāng)系統(tǒng)準備要在內(nèi)存中創(chuàng)建字符串對象的時候困鸥,會先檢查內(nèi)存中是否有相同內(nèi)容的字符串對象嗅蔬,如果有直接指向,如果沒有才會重新創(chuàng)建.
4). 存儲在常量區(qū)的數(shù)據(jù)不會被回收疾就,所以存儲在常量區(qū)的字符串也不會被回收.
-
NSString類中使用頻率最高的方法
1). 使用拼接的方式創(chuàng)建一個NSString對象
+ (instancetype)stringWithFormat:(NSString *)format,...int age = 10; NSString *str = @"jack"; NSString *newStr = [NSString stringWithFormat:@"大家好澜术,我叫%@,今年%d歲",str,age];
2). 得到字符串的長度
@property (readonly) NSUInteger length;NSString *str = @"jack"; NSUInteger len = str.length;
3). 得到字符串當(dāng)中指定下標的字符
- (unichar)characterAtIndex:(NSUInteger)index;
返回值是unichar類型的猬腰,要打印的話使用%CNSString *str = @"jack"; unichar ch = [str characterAtIndex:2]; NSLog(@"ch = %C", ch);
4). 判斷兩個字符串的內(nèi)容是否相等
a. 不能使用==來判斷OC字符串的內(nèi)容是否相同
b. == 運算符的作用: 比較左右兩邊的數(shù)據(jù)是否相同.
c. 所以如果我們要比較兩個OC字符串的內(nèi)容是否相同鸟废,不能使用==去比較.因為==比較的是字符串指針變量的值,而我們比較的是字符串的內(nèi)容
- (BOOL)isEqualToString:(NSString *) aString;
可以比較字符串的內(nèi)容NSString *str1 = @"jack"; NSString *str2 = @"jack"; [str1 isEqualToString:str2];
5). 將C語言的字符串轉(zhuǎn)換為OC字符串
+ (instancetype)stringWithUTF8String:(NSString *)string;char *str = "jack"; NSString *str1 = [NSString stringWithUTF8String: str];
6). 將OC字符串轉(zhuǎn)換為C語言字符串
@property (nullable, readonly) __strong const char *UTF8String;NSString *str = @"jack"; const char *str1 = str.UTF*String;
-
字符串讀寫
1). 將一個字符串寫入到磁盤上的某一個文件- (BOOL) writeToFile:(NSString *)path atomically:(BOOL)userAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
參數(shù)1: 將字符串內(nèi)容寫入到哪一個文件之中姑荷,寫上文件的路徑.
參數(shù)2: YES盒延,先將內(nèi)容寫入到一個臨時文件,如果成功過再搬到指定的目錄; NO,直接將內(nèi)容寫入到指定的文件鼠冕,不安全添寺,效率高
參數(shù)3: 指定寫入的時候的編碼.一般情況下使用UTF8. NSUTF8StringEncoding
參數(shù)4: 二級指針,要傳遞一個NSError指針的地址.如果寫入成功懈费,這個指針的值就是nil计露,如果失敗,這個指針就會指向一個錯誤對象,這個對象描述了發(fā)生錯誤的信息. err.localizedDescription中存儲發(fā)生錯誤的信息
返回值是BOOL類型薄坏,代表是否寫入成功.
NSString *str = @"jack"; NSError *err; [str writeToFile:@"/Users/Itcast/Desktop/abc.txt", atomically:NO encoding:NSUTF8StringEncoding error:&err];
2). 從磁盤文件讀取內(nèi)容
- (instancetype) stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;
參數(shù)1:文件的路徑
參數(shù)2:使用的編碼NSUTF8StringEncoding
參數(shù)3:錯誤對象
NSError *err; [NSString stringWithContentsOfFile:@"/Users/Itcast/Desktop/abc.txt" encoding:NSUTF8StringEncoding error:&err];
- (BOOL) writeToFile:(NSString *)path atomically:(BOOL)userAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
-
使用URL來讀寫字符串?dāng)?shù)據(jù).
1). 優(yōu)勢: 皆可以讀取本地磁盤文件趋厉,還可以讀寫網(wǎng)頁文件、ftp服務(wù)器文件
2). 不同類型的URL地址的寫法
a. 本地磁盤文件: file://+路徑---->file:///Users/Itcast/Desktop/abc.txt
b. 網(wǎng)頁地址: http://www.baidu.com/
c. ftp服務(wù)器文件的地址: ftp://server.itcast.cn/1.txt- 將不同類型的地址封裝在NSURL對象中
a. 從指定資源路徑讀取文本內(nèi)容- (nullable instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;
b. 將字符串的內(nèi)容寫入到資源路徑中
- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
c. 如果要向網(wǎng)頁或者ftp寫內(nèi)容要有權(quán)限.
- (nullable instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;
NSURL *u1 = [NSURL URLWithString:@"http://www.itcast.cn"]; NSString *str = [NSString stringWithContentsOfURL:u1 encoding:NSUTF8StringEncoding error:nil];
NSURL *u1 = [NSURL URLWithString:@"file:///Users/Itcast/Desktop/abc.txt"]; NSString *str = @"hehehe"; BOOL res = [str writeToURL:u1 atomically:NO encoding:NSUTF8StringEncoding error:nil];
- 將不同類型的地址封裝在NSURL對象中
-
字符串比較
1). 不忽略大小寫- (NSComparisonResult)compare:(NSString *)string;
NSString *str1 = @"hehehe"; NSString *str2 = @"jack"; NSComparisonResult res = [str compare:str2]; swith(res){ case NSOrderedAscending://str1小 break; case NSOrderedSame://一樣大 break; case NSOrderedDescending://str2小 break; default: break; }
2). 忽略大小寫
NSString *str1 = @"hehehe"; NSString *str2 = @"JACK"; NSComparisonResult res = [str compare:str2 option:NSCaseInsensitiveSearch]; swith(res){ case NSOrderedAscending://str1小 break; case NSOrderedSame://一樣大 break; case NSOrderedDescending://str2小 break; default: break; }
3). 比較字符串中的數(shù)字
NSString *str1 = @"hehehe001"; NSString *str2 = @"hehehe002"; NSComparisonResult res = [str compare:str2 option:NSNumericSearch];// 只能比格式固定的 swith(res){ case NSOrderedAscending://str1小 break; case NSOrderedSame://一樣大 break; case NSOrderedDescending://str2小 break; default: break; }
4). 判斷是否以某個字符串開頭
NSString *str = @"http://www.baidu.com/"; BOOL res = [str hasPrefix:@"http://"];
5). 判斷是否以某個字符串結(jié)束
NSString *str = @"/Users/Apple/Music/我們不一樣.mp3"; BOOL res = [str hasSuffix:@".mp3"];
在主串中搜索子串
1). 從前往后
- (NSRange) rangeOfString:(NSString *)searchString;
返回值NSRange類型的結(jié)構(gòu)體變量
typedef struct _NSRange{ NSUInteger location;//代表子串在主串出現(xiàn)的下標 NSUInteger length;//代表子串在主串中匹配的長度 } NSRange;
NSString *str = @"i love itcast!"; // 在str字符串中搜索@"love"出現(xiàn)的范圍 NSRange range = [str rangeOfString:@"love"]; if(range.location==NSNotFound){ // 沒有找到 } else { // 找到了 } 或者 if(range.length==0){ // 沒有找到 } else { // 找到了 }
2). 從后往前
NSString *str = @"i love itcast love!"; // 在str字符串中搜索@"love"出現(xiàn)的范圍 NSRange range = [str rangeOfString:@"love" options: NSBackwardsSearch]
NSRange結(jié)構(gòu)體
1). 是Foundation框架中定義的一個結(jié)構(gòu)體
typedef struct _NSRange{ NSUInteger location;//代表子串在主串出現(xiàn)的下標 NSUInteger length;//代表子串在主串中匹配的長度 } NSRange;
NSRange range;
// 這個結(jié)構(gòu)體變量一般情況下用來表示一段范圍胶坠,特別用在子串在主串中的范圍.
2). 聲明并初始化結(jié)構(gòu)體變量的方式
a. 最原始的方式
NSRange range; range.location = 3; range.length = 4;
b. 第二種方式: NSRange range = {3, 7};
c. 第三種方式: NSRange range = {.location = 3, .length=7};
d. Foundation框架中定義了一個函數(shù)君账,這個函數(shù)可以快速的創(chuàng)建一個NSRange結(jié)構(gòu)體.
NSMakeRange(loc, len);返回一個指定屬性的NSRange結(jié)構(gòu)體變量
NSRange range = NSMakeRange(3,7);
5. 可以將NSRange結(jié)構(gòu)體變量轉(zhuǎn)換為NSString.
NSRange range = NSMakeRange(3,7);
NSString *str = NSStringFromRange(range);-
字符串截取
1). 取到字符串中的一部分- (NSString *)substringFromIndex(NSUIntege)from;
從指定的下標處一直截取到最后
NSString *str = @"背景連鎖酒店分開計算懶死了"; NSString *newStr = [str substringFromIndex:3];
2). 從第0個開始截取指定的個數(shù)
- (NSString *)substringToIndex(NSUIntege)to;
3). 從指定位置截取指定長度的字符串 - (NSString *)substringWithRange(NSRange)range;
- (NSString *)substringFromIndex(NSUIntege)from;
-
字符串替換
1).- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement;
將字符串中第一個參數(shù)替換為第二個參數(shù),原來的指針指向的內(nèi)容是不會變的沈善,新串是以方法的返回值返回的.
NSString *str = @"背景連鎖酒店分開計算懶死了"; NSString *newStr = [str stringByReplacingOccurrencesOfString:@"背景" withString:@"廣州"];
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement;
-
字符串?dāng)?shù)據(jù)轉(zhuǎn)換為其他類型
@property (readonly)double doubleValue;
@property (readonly)float floatValue;
@property (readonly)int intValue;
@property (readonly)NSUINteger integerValue;
@property (readonly)long long longLongValue;
@property (readonly)BOOL boolValue;轉(zhuǎn)換注意:
-
其他
1). 去掉字符串前后的空格NSString *str = @" Jack "; [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
2). 將字符串轉(zhuǎn)換為大寫或者小寫
NSString *str = @" Jack "; [str uppercaseString]; [str lowercaseString];
二霎匈、
NSMutableString
1). 是Foundation框架中的一個類,從NSString繼承,是用來存儲字符串?dāng)?shù)據(jù)的.
2). NSMutableString在父類NSString的基礎(chǔ)之上做擴展,存儲在NSMutableString對象中的數(shù)據(jù)具有可變性杨何,不會新創(chuàng)建對象.-
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)容
使用建議
1). 平時使用,還是使用NSString割以,因為效率高
2). 大批量的數(shù)據(jù)拼接的時候使用NSMutableString
10次以上使用NSMutableString.NSArray
1). 是Foundation框架中的一個類,用來存儲多個數(shù)據(jù)金度,具備數(shù)組功能,所以NSArray是OC中的數(shù)組
2). 特點:
a. 只能存儲OC對象
b. 長度固定,一旦NSArray數(shù)組創(chuàng)建完畢之后,元素的長度固定严沥,無法新增猜极、刪除元素.
c. 每一個元素都是緊密相連的,每一個元素仍然有自己的下標.
d. 元素的類型是id類型的
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é)束了-
NSArray數(shù)組的編譯
1). for循環(huán)
原理: 將下標挨個遍歷出來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類型
- 使用block遍歷
- (void) enumerateObjectsUsingBlock:(void (^)OjbectType obj, NSUInteger idx, BOOL *stop))block;
這是一個方法相满,這個方法作用來遍歷數(shù)組中的每一個元素
NSArray *arr = @[@"jack",@"rose"]; // 將arr數(shù)組中的每一個元素遍歷出來 [arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop){ NSLog(@"%@", obj); // 如果想停止循環(huán),就將*stop設(shè)置為YES }];
- (void) enumerateObjectsUsingBlock:(void (^)OjbectType obj, NSUInteger idx, BOOL *stop))block;
- 使用block遍歷
-
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:","];
- (NSString *)componentsJoinedByString:(NSString *)separator
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];
這樣創(chuàng)建出來的數(shù)組對象,數(shù)組的元素是0焦人,但是有意義挥吵,可以動態(tài)的新增,刪除.
最容易犯錯:這樣寫不可以
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", anIndex:1];
- 刪除
a. 刪除
// 刪除指定下標的元素
- (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];
- 新增
-
NSNumber
1). 作用: 包裝基本數(shù)據(jù)類型NSNumber *number = [NSNumber numberWithInt:10]; 等價于 NSNumber *number = @10;