1. 程式人生 > >iOS面試題整理---關鍵字!!!

iOS面試題整理---關鍵字!!!

ins posit c const sof ans pre 沒有 頭文件 哈哈哈

關鍵字整理

static

  1.static全局變量與普通的全局變量有什麽區別?

    全局變量(外部變量)的說明之前再冠以static 就構成了靜態的全局變量。全局變量本身就是靜態存儲方式, 靜態全局變量當然也是靜態存儲方式。 這兩者在存儲方式上並無不同。

  2.static局部變量和普通局部變量有什麽區別?

    static關鍵字修飾局部變量時只被初始化一次,在程序中只有一份內存。static關鍵字可延長局部變量的生命周期,直到程序結束才銷毀。

  3.static函數與普通函數有什麽區別?

    static函數與普通函數作用域不同,僅在本文件。只在當前源文件中使用的函數應該說明為內部函數(static),內部函數應該在當前源文件中說明和定義。對於可在當前源文件以外使用的函數,應該在一個頭文件中說明,要使用這些函數的源文件要包含這個頭文件。

    static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝

const

當我們想全局共用一些數據時,可以用宏、變量、常量

宏:
    #define HSCoder @"漢斯哈哈哈"
變量:
    NSString *HSCoder = @"漢斯哈哈哈";
常量:
    四種寫法:
    static const NSString *HSCoder = @"漢斯哈哈哈";
    const NSString *HSCoder = @"漢斯哈哈哈";
    NSString const *HSCoder = @"漢斯哈哈哈";
    NSString * const HSCoder = @"漢斯哈哈哈";


const修飾位置不同,代表什麽?
1.const NSString *HSCoder = @"漢斯哈哈哈";
2.NSString const *HSCoder = @"漢斯哈哈哈";
3.NSString * const HSCoder = @"漢斯哈哈哈";

1.const NSString *HSCoder = @"漢斯哈哈哈";
"*HSCoder"不能被修改, "HSCoder"能被修改

2.NSString const *HSCoder = @"漢斯哈哈哈";
"*HSCoder"不能被修改, "HSCoder"能被修改

3.NSString * const HSCoder = @"漢斯哈哈哈";

"HSCoder"不能被修改,"*HSCoder"能被修改

註意:1和2其實沒什麽區別
結論:const右邊的總不能被修改

思考:宏與常/變量的選擇?

宏:只是在預處理器裏進行文本替換,沒有類型,不做任何類型檢查,編譯器可以對相同的字符串進行優化。只保存一份到 .rodata 段。甚至有相同後綴的字符串也可以優化,你可以用GCC 編譯測試,"Hello world" 與 "world" 兩個字符串,只存儲前面一個。取的時候只需要給前面和中間的地址,如果是整形、浮點型會有多份拷貝,但這些數寫在指令中。占的只是代碼段而已,大量用宏會導致二進制文件變大

變量:共享一塊內存空間,就算項目中N處用到,也不會分配N塊內存空間,可以被修改,在編譯階段會執行類型檢查

常量:共享一塊內存空間,就算項目中N處用到,也不會分配N塊內存空間,可以根據const修飾的位置設定能否修改,在編譯階段會執行類型檢查

extern

這個單詞翻譯過來是“外面的、外部的”。顧名思義,它的作用是聲明外部全局變量。這裏需要特別註意extern只能聲明,不能用於實現。

//在開發中,我們通常會單獨抽一個類來管理一些全局的變量或常量,下面來看看逼格比較高的一種做法:

//我們可以在.h文件中extern聲明一些全局的常量
//聲明一些全局常量
extern NSString * const name;
extern NSInteger const count;
//然後在.m文件中去實現
//實現
NSString * const name = @"王五";
NSInteger const count = 3;

@dynamic和@synthesize

iOS面試題整理---關鍵字!!!