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