一、
-
架構: 系統或者第三方事先寫好的寫很牛X功能的類,把這些類交給我們使用,這些類的集合就叫架構.
Foundation架構: 是一個包,有很多類和函數,定義了一些資料類型.這個架構中的類都是一些最基礎的類.其他的架構都是基于Foundation架構的.
UIKit.
AVFoundation.
......
-
NSString
1). NSString是一個資料類型,儲存OC字元串.
NSString的本質是一個類.
最标準的建立NSString對象的方法:
NSString *str1 = [NSString new]; NSString *str2 = [[NSString alloc] init]; NSString *str3 = [NSString string];
使用這種方式建立的字元串是一個空的字元. @""
NSString 對象是用來存儲字元串的.
2). NSString是OC中最常用的一個類,是以OC提供了一種更為快速的建立字元串對象的方式.
使用字首@
@"jack": 本質是一個NSString對象,存儲的是"jack"這個字元串
NSString *str1 = @"rose";
a. @"rose"本質是一個NSString對象,存儲的是字元串"rose"
b. 将這個字元串對象的位址傳回指派給str1指針
格式控制符%p: 列印指針變量的值,列印位址
格式控制符%@: 列印指針指向的對象
-
NSString對象的恒定性
1). 當我們使用簡要的建立字元串對象的時候,也就是使用OC字元串常量來初始化字元串指針的時候,這個字元串對象是存儲在常量區的.
NSString *str = @"jack";
當我們調用NSString的類方法來建立對象的時候, 建立的對象是存儲在堆區的.
NSString *str = [NSString stringWithFormat:@"jack"];
NSString *str = [NSString new];
2). 恒定性
當在記憶體中建立一個字元串對象後,這個字元串對象的内容就無法更改.
當我們重新為字元串指針初始化值的時候,并不是修改原來的字元串對象,而是重新的建立一個字元串對象,将這個字元串對象的位址重新指派給字元串指針變量.
3). 當系統準備要在記憶體中建立字元串對象的時候,會先檢查記憶體中是否有相同内容的字元串對象,如果有直接指向,如果沒有才會重新建立.
4). 存儲在常量區的資料不會被回收,是以存儲在常量區的字元串也不會被回收.
-
NSString類中使用頻率最高的方法
1). 使用拼接的方式建立一個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). 得到字元串當中指定下标的字元
- (unichar)characterAtIndex:(NSUInteger)index;
傳回值是unichar類型的,要列印的話使用%C
NSString *str = @"jack"; unichar ch = [str characterAtIndex:2]; NSLog(@"ch = %C", ch);
4). 判斷兩個字元串的内容是否相等
a. 不能使用==來判斷OC字元串的内容是否相同
b. == 運算符的作用: 比較左右兩邊的資料是否相同.
c. 是以如果我們要比較兩個OC字元串的内容是否相同,不能使用==去比較.因為==比較的是字元串指針變量的值,而我們比較的是字元串的内容
- (BOOL)isEqualToString:(NSString *) aString;
可以比較字元串的内容
NSString *str1 = @"jack"; NSString *str2 = @"jack"; [str1 isEqualToString:str2];
5). 将C語言的字元串轉換為OC字元串
+ (instancetype)stringWithUTF8String:(NSString *)string;
char *str = "jack"; NSString *str1 = [NSString stringWithUTF8String: str];
6). 将OC字元串轉換為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;
參數1: 将字元串内容寫入到哪一個檔案之中,寫上檔案的路徑.
參數2: YES,先将内容寫入到一個臨時檔案,如果成功過再搬到指定的目錄; NO,直接将内容寫入到指定的檔案,不安全,效率高
參數3: 指定寫入的時候的編碼.一般情況下使用UTF8. NSUTF8StringEncoding
參數4: 二級指針,要傳遞一個NSError指針的位址.如果寫入成功,這個指針的值就是nil,如果失敗,這個指針就會指向一個錯誤對象,這個對象描述了發生錯誤的資訊. err.localizedDescription中存儲發生錯誤的資訊
傳回值是BOOL類型,代表是否寫入成功.
2). 從磁盤檔案讀取内容NSString *str = @"jack"; NSError *err; [str writeToFile:@"/Users/Itcast/Desktop/abc.txt", atomically:NO encoding:NSUTF8StringEncoding error:&err];
-
(instancetype) stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;
參數1:檔案的路徑
參數2:使用的編碼NSUTF8StringEncoding
參數3:錯誤對象
NSError *err; [NSString stringWithContentsOfFile:@"/Users/Itcast/Desktop/abc.txt" encoding:NSUTF8StringEncoding error:&err];
-
-
使用URL來讀寫字元串資料.
1). 優勢: 皆可以讀取本地磁盤檔案,還可以讀寫網頁檔案、ftp伺服器檔案
2). 不同類型的URL位址的寫法
a. 本地磁盤檔案: file://+路徑---->file:///Users/Itcast/Desktop/abc.txt
b. 網頁位址:
http://www.baidu.com/ c. ftp伺服器檔案的位址: ftp://server.itcast.cn/1.txt-
将不同類型的位址封裝在NSURL對象中
a. 從指定資源路徑讀取文本内容
-
(nullable instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;
b. 将字元串的内容寫入到資源路徑中
-
(BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
c. 如果要向網頁或者ftp寫内容要有權限.
-
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];
-
-
字元串比較
1). 不忽略大小寫
- (NSComparisonResult)compare:(NSString *)string;
2). 忽略大小寫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; }
3). 比較字元串中的數字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; }
4). 判斷是否以某個字元串開頭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; }
5). 判斷是否以某個字元串結束NSString *str = @"http://www.baidu.com/"; BOOL res = [str hasPrefix:@"http://"];
NSString *str = @"/Users/Apple/Music/我們不一樣.mp3"; BOOL res = [str hasSuffix:@".mp3"];
-
在主串中搜尋子串
1). 從前往後
- (NSRange) rangeOfString:(NSString *)searchString;
傳回值NSRange類型的結構體變量
typedef struct _NSRange{ NSUInteger location;//代表子串在主串出現的下标 NSUInteger length;//代表子串在主串中比對的長度 } NSRange;
2). 從後往前NSString *str = @"i love itcast!"; // 在str字元串中搜尋@"love"出現的範圍 NSRange range = [str rangeOfString:@"love"]; if(range.location==NSNotFound){ // 沒有找到 } else { // 找到了 } 或者 if(range.length==0){ // 沒有找到 } else { // 找到了 }
NSString *str = @"i love itcast love!"; // 在str字元串中搜尋@"love"出現的範圍 NSRange range = [str rangeOfString:@"love" options: NSBackwardsSearch]
-
NSRange結構體
1). 是Foundation架構中定義的一個結構體
typedef struct _NSRange{ NSUInteger location;//代表子串在主串出現的下标 NSUInteger length;//代表子串在主串中比對的長度 } NSRange;
NSRange range;
// 這個結構體變量一般情況下用來表示一段範圍,特别用在子串在主串中的範圍.
2). 聲明并初始化結構體變量的方式
a. 最原始的方式
NSRange range; range.location = 3; range.length = 4;
b. 第二種方式: NSRange range = {3, 7};
c. 第三種方式: NSRange range = {.location = 3, .length=7};
d. Foundation架構中定義了一個函數,這個函數可以快速的建立一個NSRange結構體.
NSMakeRange(loc, len);傳回一個指定屬性的NSRange結構體變量
NSRange range = NSMakeRange(3,7);
5. 可以将NSRange結構體變量轉換為NSString.
NSString *str = NSStringFromRange(range);
-
字元串截取
1). 取到字元串中的一部分
-
(NSString *)substringFromIndex(NSUIntege)from;
從指定的下标處一直截取到最後
2). 從第0個開始截取指定的個數NSString *str = @"背景連鎖酒店分開計算懶死了"; NSString *newStr = [str substringFromIndex:3];
-
(NSString *)substringToIndex(NSUIntege)to;
3). 從指定位置截取指定長度的字元串
- (NSString *)substringWithRange(NSRange)range;
-
-
字元串替換
1).
-
(NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement;
将字元串中第一個參數替換為第二個參數,原來的指針指向的内容是不會變的,新串是以方法的傳回值傳回的.
NSString *str = @"背景連鎖酒店分開計算懶死了"; NSString *newStr = [str stringByReplacingOccurrencesOfString:@"背景" withString:@"廣州"];
-
-
字元串資料轉換為其他類型
@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;
轉換注意:
-
其他
1). 去掉字元串前後的空格
2). 将字元串轉換為大寫或者小寫NSString *str = @" Jack "; [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSString *str = @" Jack "; [str uppercaseString]; [str lowercaseString];
二、
-
NSMutableString
1). 是Foundation架構中的一個類,從NSString繼承,是用來存儲字元串資料的.
2). NSMutableString在父類NSString的基礎之上做擴充,存儲在NSMutableString對象中的資料具有可變性,不會新建立對象.
-
NSMutableString的用法
1). 建立對象
2). 往可變字元串對象中追加字元串NSMutableString *str = [NSMutableString string]; [str appendString:@"jack"];
- (void)appendString:(NSString *)aString;// 直接追加内容
-
(void)appendFormat:(NSString *)format...;// 以拼接的方式往可變字元串對象中追加内容
3). 建立NSMutableString對象時,不能使用如下方式:
4). NSMutableString做大批量的字元串拼接,速度快,因為NSMutableString隻有一個,每次修改的時候直接修改對象的内容NSMutableString *str = @"jack";
-
使用建議
1). 平時使用,還是使用NSString,因為效率高
2). 大批量的資料拼接的時候使用NSMutableString
10次以上使用NSMutableString.
-
NSArray
1). 是Foundation架構中的一個類,用來存儲多個資料,具備數組功能,是以NSArray是OC中的數組
2). 特點:
a. 隻能存儲OC對象
b. 長度固定,一旦NSArray數組建立完畢之後,元素的長度固定,無法新增、删除元素.
c. 每一個元素都是緊密相連的,每一個元素仍然有自己的下标.
d. 元素的類型是id類型的
3). NSArray數組的建立
1). 因為是一個類,是以就是建立NSArray對象.
NSArray *arr1 = [NSArray new]; NSArray *arr2 = [[NSArray alloc] init]; NSArray *arr3 = [NSArray array];
這樣建立出來的NSArray數組的元素的個數是0個,因為長度固定,是以沒有任何意義.
2). 建立數組的同時指定一個數組的元素,仍然沒有意義
NSArray *arr1 = [NSArray arrayWithObject:@"jack"];
3). 最常用建立NSArray數組的方式.
+ (instancetype)arrayWithObjects:(ObjectType)firstObj,...
NSArray *arr1 = [NSArray arrayWithObjects:@"jack",@"rose",@"lili",nil];
4). 建立NSArray簡要方式
NSArray *arr = @[@"jack", @"rose", @"lili"];
5). 使用注意
a. 隻能存儲OC對象,不能存儲非OC對象
b. 将元素寫完之後,最後要寫一個nil,表示元素到此結束了
-
NSArray數組的編譯
1). for循環
原理: 将下标挨個周遊出來
NSArray *arr = @[@"jack",@"rose"]; for(int i=0;i<arr.count;i++){ //NSLog(@"%@",arr[i]); NSLog(@"%@", [arr objectAtIndex:i]); }
2). 使用增強for循環
a. 文法格式:
for(元素類型 變量名 in 數組名){
直接通過變量名拿到數組中的每一個元素
}
NSArray *arr = @[@"jack",@"rose"]; for(NSString *str in arr){ NSLog(@"%@", str); }
b. 聲明在for()中的變量叫做疊代變量
c. 執行變量
将數組中的第一個元素的值指派給疊代變量,執行循環體
...
結束循環
d. 文法總結
-> 疊代變量的類型和數組中的元素的類型保持一緻
-> 疊代變量的名稱可以任意取
-> in是固定的
-> 周遊那個數組就将數組寫在in後面
-> 循環體裡面,疊代變量的值就是元素的值
當NSArray數組中存儲的資料類型不一緻的時候,疊代變量的類型建議使用id類型
- 使用block周遊
-
(void) enumerateObjectsUsingBlock:(void (^)OjbectType obj, NSUInteger idx, BOOL *stop))block;
這是一個方法,這個方法作用來周遊數組中的每一個元素
NSArray *arr = @[@"jack",@"rose"]; // 将arr數組中的每一個元素周遊出來 [arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop){ NSLog(@"%@", obj); // 如果想停止循環,就将*stop設定為YES }];
-
- 使用block周遊
-
NSArray和NSString
1). 将數組中元素連接配接起來組成一個新的字元串
-
(NSString *)componentsJoinedByString:(NSString *)separator
參數: 連接配接符
2). 将字元串按指定分隔符分割NSArray *arr = @[@"jack", @"rose", @"lili"]; NSString *str = [arr componentsJoinedByString:@"#"];
NSString *str = @"北京,昌平區,傳智"; // 使用字元串進行分割 NSArray *arr = [str componentsSeparatedByString:","];
-
-
NSMutableArray是NSArray的子類
1). NSMutableArray仍然是一個數組,就被NSArray的特點,隻能存儲OC對象,每一個元素是緊密相連的。
2). NSMutableArray相對于父類做的擴充,NSMutableArray數組的元素可以動态的新增和删除,其他用法與NSArray一緻。
是以:
NSArray數組一旦建立,其元素的個數就固定,無法新增與删除
NSMutableArray數組,可以新增删除
3). NSMutableArray數組的建立
NSMutableArray *arr1 = [NSMutableArray new]; NSMutableArray *arr2 = [[NSMutableArray alloc] init]; NSMutableArray *arr3 = [NSMutableArray array];
這樣建立出來的數組對象,數組的元素是0,但是有意義,可以動态的新增,删除.
最容易犯錯:這樣寫不可以
NSMutableArray *arr1 = @[@"jack", @"rose", @"lili"];
- 新增與删除
-
新增
a. // 将傳入的參數作為數組的元素添加進去
- (void)addObject:(ObjectType)anObject;
// 将另外一個數組中的每一個元素添加到可變數組中
- (void)addObjectsFromArray:(NSArray<ObjectType> *)otherArray;
NSMutableArray *arr1 = [NSMutableArray new]; [arr1 addObject:@"jack"]; NSArray *arr = @[@"jack", @"rose", @"lili"]; [arr1 addObjectsFromArray:arr];
b. 在可變數組中指定的數組中插入一個元素
- (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. 删除指定範圍内的元素
- (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). 作用: 包裝基本資料類型
NSNumber *number = [NSNumber numberWithInt:10]; 等價于 NSNumber *number = @10;