2017-05-10 2 views
0

これは本質的に私がコード内でやっていることであり、強参照されたプロパティのブロックをトリガして保持サイクルが発生するかどうかは不明です。どんな洞察?保持サイクルを起こしていますか?

@interface MyClass : NSObject 

@property(nonatomic, weak) id object1; 
@property(nonatomic) id object2; 

@end 

@implementation MyClass 

- (void)myMethod 
{ 
    [self.object2 performBlock:^{ 
     [self.object1 performSelector:@selector(mySelector)]; 
    }]; 
} 

@end 

おかげ

答えて

2

MyClassのobject2はに、あなたはあなたの自己への強い参照(MyClassのインスタンス)を維持しているperformBlockobject2はに渡すブロック内の強い参照を保持します。

object2はこのブロックを強く参照していますか?もしそうなら、保持されたサイクルが得られます。ただし、ブロックがperformBlockメソッドのスコープ内で呼び出されて破棄された場合(object2に格納されていない場合)は、問題は発生しません。

あなたが安全な再生すると、ブロック内の自己への弱参照を渡すことができるかわからない場合は:

__typeof(self) __weak weakSelf = self; 
[self.object2 performBlock:^{ 
    [weakSelf.object1 performSelector:@selector(mySelector)]; 
}]; 
+0

ありがとう!いいえ、 'performBlock'はそのブロックパラメータへの参照を保持しないので、そのまま私がそうであるように見えます。 –

2

我々はobject2のクラスを知らないので、私たちはそのperformBlock方法が実際に何をするか分かりません。しかし、おそらくブロックをすぐに実行し、そのブロックへの強い参照を永続的に格納していないように思えます。

この場合、保持サイクルはありません。

関連する問題