一、 NSString
- NSString被定義為類,是一個引用類型,
- 初始化方法:字面量初始化筛谚,內(nèi)存分配搭配初始化器,工廠方法;
- NSString擁有恒定性停忿,所有的操作無法更改字符串本身驾讲,如有更改都是返回新值的形式
- NSString擁有共享機制,在運行時的時候?qū)碛邢嗤址膕tring指向同一個指針(只有通過字面量初始化的string)
代碼演示
1.初始化
//----------------NSString初始化-------------
NSString *str1 = @"Hello World!";//字面量初始化
NSString *str2 = [[NSString alloc]initWithCString:"Hello World!" encoding:NSUTF8StringEncoding];//內(nèi)存分配搭配初始化器
NSString *str3 = [NSString stringWithCString:"Hello World!" encoding:NSUTF8StringEncoding];//工廠方法
NSString *str4 = @"Hello World!";
2.共享機制
1)代碼
//---------共享機制------
NSLog(@"str1 = %@",str1);
NSLog(@"str2 = %@",str2);
NSLog(@"str3 = %@",str3);
NSLog(@"str4 = %@",str4);
NSLog(@"str1 = %p",str1);
NSLog(@"str2 = %p",str2);
NSLog(@"str3 = %p",str3);
NSLog(@"str4 = %p",str4);
2)打印出四個字符串的內(nèi)存地址如下
image1.png
從上圖中可以看出
- 四個字符串擁有相同的內(nèi)容席赂,但是str1和str4的指針相同蝎毡。運行時會將擁有相同字符串的string指向同一個指針(只有通過字面量初始化的string)
3.恒定性
1)代碼(接著上面的代碼)
NSLog(@"----------------------------分割線----------------------------");
NSLog(@"str1.p = %p",str1);
[str1 stringByAppendingString:@" Jixin"];
NSLog(@"str1 = %@",str1);
NSLog(@"str1.p = %p",str1);
NSLog(@"");
str1 = [str1 stringByAppendingString:@" Jixin"];
NSLog(@"str1 = %@",str1);
NSLog(@"str1.p = %p",str1);
- 打印出結(jié)果如下
image2.png
從上圖中可以看出
- 在執(zhí)行了
[str1 stringByAppendingString:@" Jixin"];
后str1的值和指針都沒有改變; - 但是在執(zhí)行了
str1 = [str1 stringByAppendingString:@" Jixin"];
后str1的值和指針均改變了氧枣。 - 這說明對NSString的操作無法更改字符串本身沐兵,其實是返回的一個新的NSString。
二便监、NSMutableString
- NSMutableString具有可變性扎谎,NSString具有恒定性;
- NSMutableString為NSString的子類烧董;
- NSMutableString不具有共享機制毁靶,NSString具有共享機制;
- NSMutableString并不是在原有內(nèi)存上直接增長逊移,而是重新分配一個更大或更小的緩存容量存放字符预吆。
代碼演示
1.初始化
NSLog(@"----------------------------分割線----------------------------");
NSMutableString *mustr1 = [NSMutableString stringWithString: @"Hello,World!"];
NSLog(@"mustr1.p = %p",mustr1);
NSMutableString *mustr2 = [NSMutableString stringWithString: @"Hello,World!"];
NSLog(@"mustr2.p = %p",mustr2);
[mustr1 appendString:@" Very Good!"];
NSLog(@"mustr1 = %@",mustr1);
NSLog(@"mustr1.p = %p",mustr1);
2.NSMutableString不具有共享機制,不具有恒定性
- 打印出得結(jié)果如下
image3.png
從上圖中可以看出
- 雖然mustr1和mustr2擁有相同的文字胳泉,但是指針卻不相同拐叉;
-
[mustr1 appendString:@" Very Good!"];
可以直接修改NSMutableString的內(nèi)容,不具有恒定性扇商。
三凤瘦、NSString,NSMutableString的copy和mutableCopy
There are two kinds of object copying: shallow copies and deep copies.
1. NSString
- 代碼
NSLog(@"----------------------------分割線----------------------------");
NSString *string = @"Good to see you";
NSLog(@" string.p = %p",string);
NSString *strCopy = [string copy];
NSString *strMCopy = [string mutableCopy];
NSLog(@" strCopy.p = %p",strCopy);
NSLog(@"strMCopy.p = %p",strMCopy);
NSLog(@"");
NSLog(@" strCopy = %@",strCopy);
NSLog(@"strMCopy = %@",strMCopy);
- 打印結(jié)果
image4.png
從上圖可看出
- 對NSString執(zhí)行copy的時候是指針賦值案铺,屬于淺拷貝(指針相同)蔬芥;
- 對NSString執(zhí)行mutableCopy的時候是內(nèi)容復(fù)制,屬于深拷貝(指針不同)。
2. NSMutableString
- 代碼
NSLog(@"----------------------------分割線----------------------------");
NSMutableString *mStr = [NSMutableString stringWithString:@"Good day"];
NSLog(@" mStr.p = %p",mStr);
NSString *strCopy = [mStr copy];
NSString *strMCopy = [mStr mutableCopy];
NSLog(@" strCopy.p = %p",strCopy);
NSLog(@"strMCopy.p = %p",strMCopy);
NSLog(@"");
NSMutableString *mStrCopy = [mStr copy];
NSMutableString *mStrMCopy = [mStr mutableCopy];
NSLog(@" mStrCopy.p = %p",mStrCopy);
NSLog(@"mStrMCopy.p = %p",mStrMCopy);
- 打印結(jié)果
image5.png
從上圖可看出
- 對NSMutableString執(zhí)行copy的時候是內(nèi)容復(fù)制笔诵,屬于深拷貝(指針不同)返吻;
- 對NSMutableString執(zhí)行mutableCopy的時候是內(nèi)容復(fù)制,屬于深拷貝(指針不同)乎婿。
3.copy和mutableCopy的結(jié)論如下
- 對NSString執(zhí)行copy的時候是指針賦值测僵,屬于淺拷貝(指針相同);
- 對NSString執(zhí)行mutableCopy的時候是內(nèi)容復(fù)制次酌,屬于深拷貝(指針不同)恨课。
- 對NSMutableString執(zhí)行copy的時候是內(nèi)容復(fù)制舆乔,屬于深拷貝(指針不同)岳服;
- 對NSMutableString執(zhí)行mutableCopy的時候是內(nèi)容復(fù)制,屬于深拷貝(指針不同)希俩。