これは、Objective-Cの weakifyパターン で使用されます。
私の推測は、それが意味することです: 'weakSelf'という名前とselfのタイプ(例:MyViewController)を使用してselfに弱参照を割り当てます
それが正しいとあなたに明白に見える場合:私はこれを正しく得るために絶対に確実にしたいです。ありがとう。
私の推測は、それが意味することです:
weakSelf
という名前とtypeof
selfを使って自分自身に弱い参照を割り当てます(例:MyViewController
)
はい、それはほとんど正確にそれが意味することです。 self
のタイプはMyViewController*
(アスタリスク付き)_MyViewController
ではありません。
単に書くのではなく、この構文を使用する背後にある考え方
MyViewController __weak *weakSelf = self;
コードのリファクタリングが簡単になります。 typeof
を使用すると、コードの任意の場所に貼り付けることができるコードスニペットを定義することもできます。
libExtObjC の@weakify
と@strongify
を使用すると、ブロックの周りで時々行う「弱いダンス」を単純化するのに役立ちます。 OPはこれを引用しています 記事 。
例!
__weak __typeof(self) weakSelf = self;
__weak __typeof(delegate) weakDelegate = delegate;
__weak __typeof(field) weakField = field;
__weak __typeof(viewController) weakViewController = viewController;
[viewController respondToSelector:@selector(buttonPressed:) usingBlock:^(id receiver){
__strong __typeof(weakSelf) strongSelf = weakSelf;
__strong __typeof(weakDelegate) strongDelegate = weakDelegate;
__strong __typeof(weakField) strongField = weakField;
__strong __typeof(weakViewController) strongViewController = weakViewController;
対...
@weakify(self, delegate, field, viewController);
[viewController respondToSelector:@selector(buttonPressed:) usingBlock:^(id receiver){
@strongify(self, delegate, field, viewController);
あなたの解釈は正しいです。しかし、そのように書かれていると、読むのが少し紛らわしいです。 typeof(self)
の後にスペースを追加することをお勧めします。
__weak typeof(self) weakSelf = self;
コンパイラの設定によっては、「予想される ';」という警告が表示される場合があります。式の後」。これを修正するには、次のように__typeofを使用するように変更します。__typeof(self) __weak weakSelf = self;
Leo Natanとこの質問に感謝します: https://stackoverflow.com/a/32145709/1758224 。