宏定義
宏定義分為兩種:帶參定義與無參定義
- 帶參定義
// 帶參數(shù)的宏定義
#define HGRGB(R, G, B) [UIColor colorWithRed:(R)/255.0 green:(G)/255.0 blue:(B)/255.0 alpha:1.0]
- 無參數(shù)定義
// 無參數(shù)的宏定義
#define HGServer @"服務(wù)器地址"
常量定義
常量定義也分為兩種:全局與局部(相對整個(gè)項(xiàng)目來說的)
- 全局定義
// 在.m文件中定義
NSString* const HGNoRecord = @"No Record";
// 在.h文件中聲明
extern NSString* const HGNoRecord;
這里有兩個(gè)問題:
1.為什么要在在.m文件中定義?
2.為什么要在.h文件中聲明?
以上兩個(gè)疑問均為C語言的語法,自行思考解決.
局部定義
這里的局部定義,也要分成兩種情況:文件的局部與方法體的局部.這里只是介紹文件的局部.在很多時(shí)候,總會有這樣的需求,有一個(gè)常量只需要在本文件中使用,那么就應(yīng)該能想到一下的使用方法:
static NSString* const ID = @"771722918";
這里有一個(gè)問題:
- 1.能否將static去掉?為什么?
- 2.為C語言的語法,自行思考解決.
總結(jié)
上面有兩個(gè)地方很相似:無參數(shù)的宏定義與const的常量定義.自行查閱這兩種方法的異同. 以下是建議:
- 在項(xiàng)目中多使用宏定義與常量定義(代碼的規(guī)范化)
- 能用常量定義的盡量用常量定義(原因:C語言的語法,自行思考解決)
補(bǔ)充于 2018-10-27
宏定義的運(yùn)算連接符 # 與 ##疙驾。
一酸员、#
具體的用法,參考如下代碼:
// 定義的一個(gè)模板
#define HGTemplate(var) [NSString stringWithFormat:@""#var" = %@;", var]
// 定義的局部變量
NSString* _var = @"CoderHG";
// 結(jié)果
NSString* name = HGTemplate(_var);
NSLog(@"%@", name);
// 打印結(jié)果 : _var = CoderHG;
二劈愚、##
具體用法浴滴,參考如下代碼:
// 定義的一個(gè)模板
#define HGTemplate(var) int _##var = var;
// 定義一個(gè) age 變量
int age = 9;
// 再次定義一個(gè) _age 的變量
HGTemplate(age)
NSLog(@"%d", _age);
// 打印結(jié)果: 9
兩者的細(xì)微區(qū)別彻磁,還需要慢慢品味。
補(bǔ)充于 2018-12-16
在開發(fā)過程中,如果強(qiáng)制沒使用當(dāng)前文件使用ARC,則有如下使用:
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "Requires ARC support."
#endif
判斷是否模擬器運(yùn)行:
#if !TARGET_IPHONE_SIMULATOR
// 不是模擬器
#else
// 模擬器
#endif
在 Swift 中判斷是否為模擬器:
#if targetEnvironment(simulator)
let error = _NEHotspotConfigurationManager_is_not_supported_the_simulator_
// Swift doesn’t support the equivalent of C’s #error (r. 16015824),
// so we use the above to get a meaningful error in the Issues navigator.
#endif
禁止使用:
- (instancetype)init UNAVAILABLE_ATTRIBUTE;
+ (instancetype)new __attribute__((unavailable("new方法不可用辙浑,請用initWithName:")));
- (void)hgPrint NS_UNAVAILABLE;
類似這樣禁止使用的宏激涤,僅僅是在編譯的過程中報(bào)錯(cuò)。換句話說如果使用 performSelector: ,也是可以調(diào)用成功的判呕。
初始化構(gòu)造方法:
// NS_DESIGNATED_INITIALIZER: Designed initializer
- (instancetype)initWithName:(NSString*)name age:(NSInteger)age NS_DESIGNATED_INITIALIZER;
一旦使用這個(gè)宏倦踢,一定要滿足所有的構(gòu)造方法都必須要走這個(gè)方法,否則視為設(shè)計(jì)不合理侠草。其實(shí)這個(gè)用途還是很大的辱挥,使用了這個(gè)宏,讓很多人很快能定位具體的初始化構(gòu)造方法梦抢。