宏(#define)與常量(const)的使用

iOS開發中常常用到#define進行文本替換,const修飾數據類型。下面說一下他們的使用細節。git

#define宏

  • 通常#define放在程序開始,在#import以後,也能夠放在其餘任何位置,可是必須先定義後引用。
  • 預約義的名稱和變量的行爲模式不一樣,沒有局部定義之類的說法。在一個方法內定義,就能夠在這個方法以後的任何位置使用。
  • 定義若是須要兩行,那麼上一行的最後一個字符必須是反斜線符號\,用以告訴預處理程序這裏存在一個後續。
  • 預約義名稱不是變量,所以不能爲他賦值,除非替換指定值的結果其實是一個變量。爲了和變量進行區分,通常定義名稱都是大小字母組合。
  • 宏是進行完整字符替換,若是不是特別肯定須要分號,不要在定義語句末尾添加分號。
  • 沒有類型,不進行類型檢查。
  • 對同一個宏在多個地方進行引用,每一個引用都會開闢一塊內存。

使用#define定義的宏可使用#undef命令取消定義。github

const常量

  • 只分配一次內存空間。項目中用到屢次,也不會屢次分配內存空間。
  • 編譯時會進行類型檢查,及時提醒錯誤。

另外說一下NSString const *varNSString * const var的區別。常常遇到的有objective-c

const NSString *var	
NSString const *var // 與上一個意義相同
NSString * const var 
複製代碼

const NSString *varNSString const *var沒有區別。由於NSString自己就是不可變的,此處的const沒有任何用途。const右側的爲定義的常量,沒法修改。bash

  1. 下面的var不能作任何修改。
static NSString * const var;       // a
static NSString const * const var; // 與a相同,第一個const沒有任何用途
static const NSString * const var; // 與a相同,第一個const沒有任何用途
複製代碼
  1. 下面的var對象的值不能修改,但能夠修改指針指向。
static NSString * var;              // b
static NSString const * var;        // 與b相同,const沒有任何用途
static const NSString * var;        // 與b相同,const沒有任何用途
複製代碼
  1. 下面的var對象的值能夠改變,指針指向不能改變。
static NSMutableString * const var; // c
複製代碼
  1. 下面的pro648對象的值和指針均可以改變。
static NSMutableString * pro648; // d
複製代碼

下面代碼表明的是pro648指針指向地址被改變了,即開始時指向@"a",後來指向@"b",而不是字符串@"a"改變了。app

pro648 = @"a";
pro648 = @"b";
複製代碼

事實上不能修改NSString對象的內容,NSMutableString對象可使用appendString:方法修改。spa

若是聲明pro648變量方法是:3d

NSString const *pro648
複製代碼

最後pro648會指向@"b"。若是聲明pro648變量方法是:指針

NSString * const pro648
複製代碼

當嘗試爲pro648再次賦值時,即修改其指針指向時,編譯器會發出*Can not assign to variable 'var' with const-qualified type 'NSString * const-strong'*的警告。code

參考資料:對象

  1. What is a better practice when defining a const NSString object in objective-c

  2. #define vs const in Objective-C

歡迎更多指正:github.com/pro648/tips…

本文地址:github.com/pro648/tips…

相關文章
相關標籤/搜索