2016-12-03 2 views
0
- (void)test 
{ 
    __weak typeof(self) weakSelf = self; 
    [weakSelf test]; 
} 

は、Objective-Cではclangは弱いptrをどのように実装していますか?

static void _I_Foo_test(Foo * self, SEL _cmd) { 
__attribute__((objc_ownership(weak))) typeof(self) weakSelf = self; 
((void (*)(id, SEL))(void *)objc_msgSend)((id)weakSelf, sel_registerName("test")); 
} 

にコンパイル。

weakptrは、C++のstd::share_ptrのようなライブラリではなく、コンパイラによって提供されます。

コンパイラはどのように弱いptrを実装しますか?このようなものでしょうか。

-(void)dealloc 
{ 
    self.weakRef = nil; 
    ... 
} 

-(void)test 
{ 
    self.weakRef = new WeakRef(self); 
} 

答えて

1

Objective-Cの弱いポインタは、ライブラリでもあるobjcランタイムによって提供されます。ウィークポインタの内容へのアクセスは、たとえばobjc_loadWeak()によって行われます。詳細については、Automatic Reference Countingに関するclangのドキュメントを参照してください。

関連する問題