iOS - Tips - 黑魔法

weixin_33912445發表於2018-03-26

1. objc_subclassing_restricted

在@ interface 前, 用__attribute__((objc_subclassing_restricted))修飾的類, 不允許繼承.

2. objc_requires_super

- (void)method __attribute__((objc_requires_super));修飾的方法, 標識著在子類繼承這個方法時, 需要呼叫 super

3. objc_boxable

@(...) 語法糖可以將基本資料型別 box 成 NSNumber 物件,假如想 box 一個 struct 型別或是 union 型別成 NSValue 物件,可以使用這個屬性:

typedefstruct__attribute__((objc_boxable)) {

CGFloatx, y, width, height;

} XXRect;

CGRect rect1 = {1, 2, 3, 4};

NSValue *value1 = @(rect1);// <--- Compile Error

XXRect rect2 = {1, 2, 3, 4};

NSValue *value2 = @(rect2); // √

4. constructor / destructor

構造器和析構器,加上這兩個屬性的函式會在分別在可執行檔案(或 shared library)load和 unload 時被呼叫,可以理解為在 main() 函式呼叫前和 return 後執行:

PS:若有多個 constructor 且想控制優先順序的話,可以寫成 __attribute__((constructor(101))),裡面的數字越小優先順序越高,1 ~ 100 為系統保留。

__attribute__((constructor)) static void beforeMain(void) { NSLog(@"beforeMain"); } __attribute__((destructor)) static void afterMain(void) { NSLog(@"afterMain"); }

int main(int argc, const char * argv[]) {

NSLog(@"main");

return 0;

} // Console: // "beforeMain" -> "main" -> "afterMain"