2017-12-06 5 views
0

ブロックから呼び出されているメソッドでivarを使用したいと思います。保持サイクルを起こさずに直接ivarを呼び出すのはいいですか? 私は、プロパティを呼び出すことに関連する他の質問を見ました。私たちはivarsを直接確認したいのですが、ivarを直接呼び出すことはできますか?self - > _ myInstanceVariableを明示的に使用する必要がありますか?この場合ブロックから呼び出されるメソッド内のivarの使用

__weak MyClassName *weakSelf = self; 
[MyBlockCreator myBlock:^{ 
    MyClassName *strongSelf = weakSelf; 
    [strongSelf doSomething]; 
}]; 

- (void) doSomething { 
    _myInstanceVariable = someObject 

    // is it fine to use the ivar directly above? 
    // or do we want use self explicitly? 
    // like self->_myInstanceVariable 
} 
+2

'_someInstanceVar'と' self - > _ someInstanceVar'には違いはありません。彼らは同じことです。 – rmaddy

答えて

0

あなたはselfブロックとAを参照する場合は、保持サイクルを引き起こすことができる唯一の状況は、全く強い/参照が弱いようにする必要がありませんselfの強力なバージョンがそのブロック内に取り込まれます。 selfは問題のブロックを保持していないので、強い参照を使用しても保持サイクルはありません。 selfは、ブロックへの強い参照を保持し、ブロックがselfを指し状況で

[Foo doWithBlock:^{ 
    bar.baz = @"Hello World"; // Totally fine without weak/strong since bar doesn't retain the block here. 
}]; 

、あなたは再び内部のそれを強くするブロックの外側の参照が弱いようにする必要があります。

__weak id weakSelf = self; 
[self doWithBlock:^{ 
    id strongSelf = weakSelf; 
    strongSelf.baz = @"Ok"; 
}]; 
関連する問題