ios-源碼分析
typedef struct objc_class *Class;
struct objc_class : objc_object {
}
typedef struct objc_object *id;
id objc_alloc(Class cls) {
? ? return callAlloc(cls, true/*checkNil*/, false/*allocWithZone*/)
}
objc_alloc的問題:
symbol stub for: objc_alloc的方式 沒有調(diào)用objc_msgSend
普通的方法調(diào)用objc_msgSend發(fā)送消息
1噪服、為什么會走objc_alloc
2、為什么只走一次
答:a、走的symbol符號 - 沒有走objc_msgSend
b蟆盐、并不是我們調(diào)用,而是系統(tǒng)調(diào)用一個符號——通過MachOView我們可以發(fā)現(xiàn)在Symbol Tables下面看到了 _objc_alloc,即在編譯期間就有了 編譯器:Clang
c、LLVM
查看到 系統(tǒng)有一個代碼:
A* test_alloc_class_ptr() {
? ? // CALLS: {{call.*@objc_alloc}}
????// CALLS-NEXT: bitcast i8*
????// CALLS-NEXT: ret
????return [B alloc];
}