OC 30 day
近來到台北工作,好久沒有吃到好吃的滷肉飯了。
在看Foundation之前,先來暸解,什麼是框架?
就是系統(apple)或者是第三方(其他高手)事先寫好的一些功能,把這些類交給我們使用,這些類的集合我們叫做框架。
框架中有很多很多功能,相似的類,函數庫。
是一個包,這裡面有很多類,函數,定義了一些數據類型。這個框架中的類都是一些最基礎的類。NSString NSObject 其他的框架都是基於Foundation框架的。
UIKit.
AVFoundation.
...
Foundation 量大又簡單
NSString 是一個數據類型,保存OC字符串。
NSString 的本質是一個類,既然是一個類。
所以,最標準的創建 NSString對象的方式:
NSString *str1 = [NSString new];
NSString *str2 = [[NSString alloc] init];
NSString *str3 = [NSString string];
使用這種方式創建的字符串是一個空的字符。 @""
NSString 對象就是用來儲存字符串。
使用前綴@
@"jack"; 本質上這是一個NSString 對象。這個NSString對象中儲存的是"jack"這個字符串。
NSString *str1 = @"rose";
@rose 本質上是一個NSString 對象,這個對象中儲存的是字符串"rose"。
將這個字符串對象的地址返回賦值給str1指針。
格式控制符%p:打印指針變量的值。
%@:打印指針指向的對象。
什麼是恆定性?當我們使用簡要的創建對象的時候,也就是使用一個OC字符串量來初始化字符串指針的時候。這個字符串對象是儲存在常量區(數據段)的
NSString *str = @"jack";
NSString *str2 = [NSString new];
創建的字符串對象是儲存在heap。
當在內存中創建一個字符串對象以後,這個字符串對象的內容就無法修改了。當我們重新為字串指針初始化值得時候,並不是修改原來的字符串對象。而是重新的創建一格字符串對象。將這個字符串對象的地址重新複製給字串指針變量。
當系統準備要在內存中創建字符串對象的時候,會先檢查內存是否有相同內容的字符串對象。如果有,直接指向。如果沒有才會重新創建。
int main(int argc, char * argv[]) {
NSString *str1 = @"jack";
NSString *str2 = [NSString new];
NSLog(@"\nstr1 = %p\nstr2 = %p",str1,str2);
NSLog(@"---------------更改----------------");
str1 = @"wang";
str2 = @"wang";
NSLog(@"\nstr1 = %p\nstr2 = %p",str1,str2);
}
str1 = 0x1059891d8
str2 = 0x105ef32f0
2021-02-02 14:17:36.232140+0800
test3[94276:1268487] ---------------更改----------------
2021-02-02 14:17:36.232319+0800 test3[94276:1268487]
str1 = 0x105989338
str2 = 0x105989338
儲存在常量區的數據不會被回收。所以儲存在常量區的字符串對象也不會被回收。
int main(int argc, char * argv[]) {
NSString *str1 = @"jack";
NSString *str2 = [NSString new];
NSLog(@"\nstr1 = %p\nstr2 = %p",str1,str2);
str1 = @"wang";
str1 = nil;
NSLog(@"\nstr1 = %p\nstr2 = %p",str1,str2);
}
str1 = 0x106e101d8
str2 = 0x106e101d8
2021-02-02 14:26:11.164321+0800 test3[94370:1281904]
str1 = 0x0
str2 = 0x106e101d8
NSString 是一個類,那麼他鐵定有很多方法。
+ (instancetype)stringWithFormat:(NSString *)format, ...
@property (readonly) NSUInteger length;
- (unichar)characterAtIndex:(NSUInteger)index;
能否使用 == 來判斷兩個OC字符串的內容是否相同。
== 預算符的作用,比較左右兩邊的數據是否相同。
10 == 10 這個時候直接比較的是左右兩邊的數據。
a == b 兩邊也可以寫一個變量,這個時候直接比較的是左右兩邊變量的值是否相同。
如果兩丟是一個指針變量,那麼比較的也是變量的值。只不過指針變量的值是地址。
所以,如果我們要比較兩個OC字符串的內容是否相同,不能使用 == 比較。因為 == 比較的是字符串指針變量的值。而我們要比較的是兩個字符串指針指向的字符串對象的內容是否相同。
BOOL res = [str1 isEqualToString:str2];