web-dev-qa-db-ja.com

正確には「__weak typeof(self)weakSelf = self;」とは何ですか?平均

これは、Objective-Cの weakifyパターン で使用されます。

私の推測は、それが意味することです: 'weakSelf'という名前とselfのタイプ(例:MyViewController)を使用してselfに弱参照を割り当てます

それが正しいとあなたに明白に見える場合:私はこれを正しく得るために絶対に確実にしたいです。ありがとう。

29
brainray

私の推測は、それが意味することです:weakSelfという名前とtypeof selfを使って自分自身に弱い参照を割り当てます(例:MyViewController

はい、それはほとんど正確にそれが意味することです。 selfのタイプはMyViewController*(アスタリスク付き)_MyViewControllerではありません。

単に書くのではなく、この構文を使用する背後にある考え方

MyViewController __weak *weakSelf = self;

コードのリファクタリングが簡単になります。 typeofを使用すると、コードの任意の場所に貼り付けることができるコードスニペットを定義することもできます。

27
dasblinkenlight

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);
7
CrimsonChris

あなたの解釈は正しいです。しかし、そのように書かれていると、読むのが少し紛らわしいです。 typeof(self)の後にスペースを追加することをお勧めします。

__weak typeof(self) weakSelf = self;
5
Zev Eisenberg

コンパイラの設定によっては、「予想される ';」という警告が表示される場合があります。式の後」。これを修正するには、次のように__typeofを使用するように変更します。__typeof(self) __weak weakSelf = self;

Leo Natanとこの質問に感謝します: https://stackoverflow.com/a/32145709/1758224

4
Eli Burke