- 不要等到明天,明天太遙遠,今天就行動。
須讀:看完該文章你能做什么?
字符串的幾種創建方式以及存儲位置
深拷貝 和 淺拷貝的基本概念
學習前:你必須會什么?(在這里我已經默認你具備C語言的基礎了)
NSString的基本使用
一、本章筆記
一、創建字符串對象(三種方式) 存儲空間也不一樣
NSString *str1 = @"lyh";
NSString *str2 = [[NSString alloc]initWithFormat:@"lyh"];
NSString *str3 = [NSString stringWithFormat:@"lyh"];
二、通過不同的方式創建字符串,字符串對象存儲的位置也不一樣
>如果通過字符串常量創建, 那么字符串對象存儲在常量區中
>如果通過alloc initWithFormat / stringWithFormat 創建,那么字符串對象存儲在 堆區中
而且需要注意:
>不同的平臺存儲的方式也不一樣 , 如果是Mac平臺 系統自動對字符串對象進行優化,但是iOS平臺就是兩個對象
>不同的編譯器存儲的方式也不一樣 , 如果是Xcode6以下并且是在iOS平臺,那么是兩個對象,如果在Xcode6以上 那么alloc 多次指向 同一塊存儲空間
三、
一般情況下,只要通過alloc 或者 通過類工廠方法創建的對象,每次都會在堆內存中 開辟一塊新的存儲空間
但是 如果是通過 alloc的initWithString方法除外,因為這個方法是通過copy返回一個字符串對象給我們
而copy又分為 深拷貝和淺拷貝,
如果是深拷貝 會創建一個新的對象,
如果是淺拷貝 不會創建一個新的對象,而是直接返回被拷貝的對象的地址給我們
而initWithFormat正好是淺拷貝,所以無論是在什么平臺,什么編譯器 都是指向同一塊存儲空間
二、code
main.m
#pragma mark 07-字符串基本概念
#pragma mark 概念
/*
一、創建字符串對象(三種方式) 存儲空間也不一樣
NSString *str1 = @"lyh";
NSString *str2 = [[NSString alloc]initWithFormat:@"lyh"];
NSString *str3 = [NSString stringWithFormat:@"lyh"];
二、通過不同的方式創建字符串,字符串對象存儲的位置也不一樣
>如果通過字符串常量創建, 那么字符串對象存儲在常量區中
>如果通過alloc initWithFormat / stringWithFormat 創建,那么字符串對象存儲在 堆區中
而且需要注意:
>不同的平臺存儲的方式也不一樣 , 如果是Mac平臺 系統自動對字符串對象進行優化,但是iOS平臺就是兩個對象
>不同的編譯器存儲的方式也不一樣 , 如果是Xcode6以下并且是在iOS平臺,那么是兩個對象,如果在Xcode6以上 那么alloc 多次指向 同一塊存儲空間
三、
一般情況下,只要通過alloc 或者 通過類工廠方法創建的對象,每次都會在堆內存中 開辟一塊新的存儲空間
但是 如果是通過 alloc的initWithString方法除外,因為這個方法是通過copy返回一個字符串對象給我們
而copy又分為 深拷貝和淺拷貝,
如果是深拷貝 會創建一個新的對象,
如果是淺拷貝 不會創建一個新的對象,而是直接返回被拷貝的對象的地址給我們
而initWithFormat正好是淺拷貝,所以無論是在什么平臺,什么編譯器 都是指向同一塊存儲空間
*/
#pragma mark - 代碼
#import <Foundation/Foundation.h>
#pragma mark 類
#pragma mark - main函數
int main(int argc, const char * argv[])
{
// 如何創建字符串對象
#pragma mark 1.通過不同的方式創建字符串,字符串對象存儲的位置也不一樣
/*
>如果通過字符串常量創建, 那么字符串對象存儲在常量區中
>如果通過alloc initWithFormat / stringWithFormat 創建,那么字符串對象存儲在 堆區中
而且需要注意:
>不同的平臺存儲的方式也不一樣 , 如果是Mac平臺 系統自動對字符串對象進行優化,但是iOS平臺就是兩個對象
>不同的編譯器存儲的方式也不一樣 , 如果是Xcode6以下并且是在iOS平臺,那么是兩個對象,如果在Xcode6以上 那么alloc 多次指向 同一塊存儲空間
*/
// 1.通過字符串常量創建
// 注意 : 如果通過字符串常量 創建字符串對象, 并且字符串常量的內容一致,那么如果創建多個字符串對象,對個對象指向同一塊存儲空間
NSString *str1 = @"lyh";
NSString *str11 = @"lyh";
NSLog(@"str1 = %p,str11 = %p",str1,str11); // str1 = 0x100001038,str11 = 0x100001038
// 2.通過alloc init創建 (如果是Mac平臺 系統自動對字符串對象進行優化)
// 只要通過alloc 就會在堆內容中 開辟一塊存儲空間
NSString *str2 = [[NSString alloc]initWithFormat:@"lyh"];
NSString *str22 = [[NSString alloc]initWithFormat:@"lyh"];
NSLog(@"str2 = %p,str22 = %p",str2,str22); // str2 = 0x68796c35,str22 = 0x68796c35
// 3.通過類工廠方法創建 stringWithFormart
// 內部其實 就是封裝 alloc init
NSString *str3 = [NSString stringWithFormat:@"lyh"];
NSString *str33 = [NSString stringWithFormat:@"lyh"];
NSLog(@"str3 = %p,str33 = %p",str3,str33); // str3 = 0x68796c35,str33 = 0x68796c35
/*
注意 : 一般情況下,只要通過alloc 或者 通過類工廠方法創建的對象,每次都會在堆內存中 開辟一塊新的存儲空間
但是 如果是通過 alloc的initWithString方法除外,因為這個方法是通過copy返回一個字符串對象給我們
而copy又分為 深拷貝和淺拷貝,
如果是深拷貝 會創建一個新的對象,
如果是淺拷貝 不會創建一個新的對象,而是直接返回被拷貝的對象的地址給我們
而initWithFormat正好是淺拷貝,所以無論是在什么平臺,什么編譯器 都是指向同一塊存儲空間
*/
NSString *str4 = [[NSString alloc]initWithString:@"lyh"];
NSString *str44 = [[NSString alloc]initWithString:@"lyh"];
NSLog(@"str4 = %p,str44 = %p",str4,str44); // str4 = 0x68796c35,str44 = 0x68796c35
return 0;
}