iOS小知識之物件的本質

語言: CN / TW / HK

小知識,大挑戰!本文正在參與“程式設計師必備小知識”創作活動。

每天一個小知識,穩步前進不用愁。 使用clang還原Objective-C程式碼在底層的實現,來探索物件的本質是什麼! 開啟main.m函式,寫入如下程式碼:

```

import

import

@interface LGPerson : NSObject @property (nonatomic, strong) NSString *Name; @end @implementation LGPerson @end int main(int argc, const char * argv[]) { @autoreleasepool { NSLog(@"Hello, World!"); } return 0; } ``` 使用clang命令,生成main.cpp檔案

clang -rewrite-objc main.m -o main.cpp 通過分析cpp檔案,來探索物件的本質 找到LGPerson的定義與實現,可以發現

``` typedef struct objc_object LGPerson;

struct LGPerson_IMPL { struct NSObject_IMPL NSObject_IVARS; NSString *_Name; }; `` -LGPerson定義為objc_object型別 -LGPerson_IMPLLGPerson的底層實現 -LGPerson_IMPL中巢狀NSObject_IMP`L結構體 - 結構體巢狀相當於偽繼承 找到NSObject的定義與實現,可以發現

``` typedef struct objc_object NSObject;

struct NSObject_IMPL { Class isa; }; `` -NSObject定義為objc_object型別 -NSObject_IMPLNSObject的底層實現 - 只有一個Class型別的成員變數isa` 找到Class的定義與實現,可以發現

``` typedef struct objc_class *Class;

struct objc_class { Class _Nonnull isa attribute((deprecated)); } attribute((unavailable)); `` -Class型別,本質是objc_class結構體指標,佔8位元組`

找到objc_object的實現,可以發現

struct objc_object { Class _Nonnull isa __attribute__((deprecated)); }; - objc_object只有一個Class型別的成員變數isa - 所有物件的底層實現,本質上都來自於objc_object結構體


結論: - 物件的本質是結構體 - 類也是物件,本質同樣是結構體 - 萬物皆物件,萬物皆有isa - isa本質是結構體指標,佔8位元組 - 所有物件的底層實現,本質上都來自於objc_object結構體