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