2017-06-27 18 views
1

私はReactiveCocoaとlibextobjcでこの種の使い方を見つけました。ブロックは、それが自己という名前のローカル変数を作成し、グローバル変数を置き換えます実行された場合には@strongifyと@weakifyはiOSで本当に安全ですか?

@try {} @finally {} __attribute__((objc_ownership(strong))) __typeof__(self) self = self_weak_;

:私は@strongifyがコンパイルされたとき、それは変更になっていることを知っています。

@interface A: NSObject 
    @property (nonatomic,copy) TestBlock testBlock; 
@end 

@implementation A 
- (void) someAPI{ 
    @weakify(self) 
    self.testBlock = ^{ 
     @strongify(self)//the global variable of self was captured by this block before this line was executed. 
     if (self != nil) 
     { 
      [self doSomethingAwesome]; 
      [self doSomethingAwesomeAgain]; 
     } 
    }; 
} 

@end 

私の質問: 1.ブロックが実行される前に、ローカル変数が生成されましたです。 2.ブロックがコピーされ、呼び出されたことがない場合は、円を保持しますか?

私の貧しい私の英語のために申し訳ありません!

答えて

0

@weakifyと@strongifyはマクロです。コードがコンパイルされる前に、前処理中にマクロが展開されます。マクロを展開すると、ここに保持サイクルがないことが明らかになります。

- (void) someAPI{ 
    __weak A *self_weak_ = self; 
    self.testBlock = ^{ 
     //suppress shadowing variable warning 
     _Pragma("clang diagnostic push") 
     _Pragma("clang diagnostic ignored \"-Wshadow\"") 

     __strong A *self = self_weak_; //this is a new reference, the original self is not being captured. 

     //pop shadowing variable warning 
     _Pragma("clang diagnostic pop") 

     if (self != nil) 
     { 
      [self doSomethingAwesome]; 
      [self doSomethingAwesomeAgain]; 
     } 
    }; 
} 
関連する問題