2016-03-24 4 views
-2

私はこのような状況がある:Objective-C:メソッドの内部で定義されたブロックは強弱ですか?

- (void)someMethod 
{ 
    __weak typeof(self) weakSelf = self; 

    void (^myBlock1)(void) = ^{ 
     // ... do stuff 
    }; 

    void (^myBlock2)(void) = ^{ 
     [weakSelf doSomeHeavyNetworkCall2:^{ 
      myBlock1(); 
     }]; 
    }; 

    [self doSomeHeavyNetworkCall1:^{ 
     myBlock2(); 
    }]; 
} 

この場合にはmyBlock1とmyBlock2のライフサイクルは何ですか?私はこのような無しをチェックするべきですか?

void (^myBlock2)(void) = ^{ 
    [weakSelf doSomeHeavyNetworkCall2:^{ 
     if (myBlock1) { 
      myBlock1(); 
     } 
    }]; 
}; 

[self doSomeHeavyNetworkCall1:^{ 
    if (myBlock2) { 
     myBlock2(); 
    } 
}]; 

また、私は、@synchronized全体someMethodを包む私の周りのブロックを持っていることを保証していますか?

+0

'@ synchronized'に' someMethod'をラップして、これらのブロックが非同期で実行されると、それらは同期されないことに注意してください。 '@ synchronized'指示文は、同期して実行される指示にのみ影響します。あなたの意図がコールバックを同期させることであるならば、 'someMethod'をラップしないで、' @ synchronized'ディレクティブをブロック内に置かなければなりません。 – Rob

答えて

2

Objective-Cでは、ローカル変数がデフォルトで強いので、myBlock1myBlock2は強いです。 if (myBlock1)if (myBlock2)のチェックは必要ありません。

someMethodの内容を@synchronizedとラップしても、これらの変数のライフサイクルには影響しません。

+0

ありがとうございます。したがって、それらが保持されている場合、このインスタンスも保持されます。それは私が '__weak typeof(self)weakSelf = self;'と '[weakSelf doSomeHeavyNetworkCall2:^ {'のどちらかを持つ必要はないという意味ですか? – Gomfucius

+0

'weakSelf'の使用は、潜在的な参照サイクルに関連する全く別の問題です。しかし、これは 'myBlock1'と' myBlock2'変数とは関係ありません。 – rmaddy