synchronized 編譯記錄

源碼

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
        
        NSObject *objc = [[NSObject alloc] init];
        
        @synchronized (objc) {
            NSLog(@"加了鎖的 Log ");
        }
        
        
    }
    return 0;
}

通過(guò) xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o mainC.cpp 編譯 cpp 文件

int main(int argc, const char * argv[]) {
    /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool;

        NSObject *objc = ((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("NSObject"), sel_registerName("alloc")), sel_registerName("init"));
        
        { id _rethrow = 0; id _sync_obj = (id)objc; objc_sync_enter(_sync_obj);
            
            try {
                struct _SYNC_EXIT {
                    
                    _SYNC_EXIT(id arg) : sync_exit(arg) {}
                    
                    ~_SYNC_EXIT() {objc_sync_exit(sync_exit);}
                    
                    id sync_exit;
                    
                } _sync_exit(_sync_obj);
                
                NSLog((NSString *)&__NSConstantStringImpl__var_folders_dv_nb1mrprn3kj3cnk3tts4918w0000gn_T_main_352584_mi_1);
            } catch (id e) {_rethrow = e;}
            
            
            { struct _FIN { _FIN(id reth) : rethrow(reth) {}
                ~_FIN() { if (rethrow) objc_exception_throw(rethrow); }
                id rethrow;
            } _fin_force_rethow(_rethrow);}
        }
        
        
        
    }
    return 0;
}

解析

truct _SYNC_EXIT {
                    
                    _SYNC_EXIT(id arg) : sync_exit(arg) {}
                    
                    ~_SYNC_EXIT() {objc_sync_exit(sync_exit);}
                    
                    id sync_exit;
                    
                } _sync_exit(_sync_obj);

聲明了一個(gè)結(jié)構(gòu)體 _SYNC_EXIT

_SYNC_EXIT(id arg) : sync_exit(arg) {} 是這個(gè)結(jié)構(gòu)體的構(gòu)造函數(shù),sync_exit(arg) 是用arg 來(lái)初始化 sync_exit 這個(gè)成員

~_SYNC_EXIT() {objc_sync_exit(sync_exit);} 是這個(gè)對(duì)象的析構(gòu)函數(shù), 在釋放時(shí)會(huì)執(zhí)行 objc_sync_exit

_sync_exit(_sync_obj) 是直接聲明了一個(gè) _sync_exit 變量并用 _sync_obj 初始化

NSLog((NSString *)&__NSConstantStringImpl__var_folders_dv_nb1mrprn3kj3cnk3tts4918w0000gn_T_main_352584_mi_1); 為什么在析構(gòu)函數(shù)下面,因?yàn)?_sync_exit 對(duì)象是在釋放的時(shí)候銷毀的所以只有這個(gè)代碼塊執(zhí)行完才會(huì)調(diào)用 ~_SYNC_EXIT() 然后才會(huì)執(zhí)行 objc_sync_exit(sync_exit)

所以整體執(zhí)行順序?yàn)? objc_sync_enter(_sync_obj) -> NSLog -> objc_sync_exit(sync_exit)

所以 synchronized 實(shí)現(xiàn)可以斷定為調(diào)用

objc_sync_enter
objc_sync_exit

可通過(guò) objc 源碼查看 objc_sync_enter/objc_sync_exit 函數(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容