第07天OC語言(07):字符串基本概念

  • 不要等到明天,明天太遙遠(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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 不要等到明天,明天太遙遠(yuǎn),今天就行動。 須讀:看完該文章你能做什么? 字符串的內(nèi)容比較字符串的大小比較(忽略和不忽...
    liyuhong閱讀 465評論 0 0
  • 不要等到明天,明天太遙遠(yuǎn),今天就行動。 須讀:看完該文章你能做什么? 字符串的替換(替換某一個字符串,替換首尾) ...
    liyuhong閱讀 867評論 0 0
  • 不要等到明天,明天太遙遠(yuǎn),今天就行動。 須讀:看完該文章你能做什么? 了解URL的基本概念字符串的讀寫(url獲取...
    liyuhong閱讀 237評論 0 0
  • 不要等到明天,明天太遙遠(yuǎn),今天就行動。 須讀:看完該文章你能做什么? 字符串的轉(zhuǎn)換(大小寫,C轉(zhuǎn)OC,OC轉(zhuǎn)C) ...
    liyuhong閱讀 530評論 0 0
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,616評論 30 472

友情鏈接更多精彩內(nèi)容