6

私は保持サイクルを理解するために多くの研究をしようとしました。しかし、私の例では何も見つからないようです。プロパティをクロージャーに設定すると、保持サイクルが発生し、弱いまたは所有されていないものを使用する必要があることを私は知っています。しかし、それらが正しく行われているかどうかを知りたい 2 つの例があります。

シンプルなアニメーション

UIView.transitionWithView(self, duration: 5, options: .TransitionCrossDissolve, animations:    { [weak self] in
    self?.setNeedsDisplay()
    return
}, completion: nil)

配列を使ったアニメーション

for imageView in self.townImages {
    UIView.transitionWithView(imageView, duration: 0.3, options: .TransitionCrossDissolve, animations: { () -> Void in
        imageView.image = UIImage(named: self.getImages()[count++])
    }, completion: nil)
}

これらの例の両方で、selfは のサブクラスですUIView。私はそれを正しく行っているか、または imageView を弱参照として使用する必要があるかどうかを知りたいだけです。ありがとう。

4

1 に答える 1

3

ブロックが に接続されていないため、これらのいずれも保持サイクルを作成しませんself。さらに、寿命が保証された保持サイクルは、世界で最悪のものではありません。

いくつかの例を考えてみましょう。(すみません、私のswiftは特に強くないので、obj-cに戻します。)


- (void)doSomething:(void(^)())block {
  self.block = block;
}

// elsewhere
  [self doSomething:^{
    self.someProperty = 5;
  }];

selfこれにより、参照を保持するブロック内で (弱くはない) が参照されるため、保持サイクルが作成されselfます。


[UIView transitionWithView:self duration:5, options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
  [self setNeedsDisplay];
} completion:nil];

animationsブロックがシステムに送信されるため、保持サイクルは作成されUIViewません。サブクラスはブロックへの参照を保持していません。


補足: 閉鎖の最後に a を付ける必要はありませんが、returnswift はばかげており、「役立つ」ように努めていると思います。self.setNeedsDisplay()また、それ自体を行う必要があるため、アニメーション中に呼び出す必要があるかどうかはわかりません...

于 2014-11-14T17:10:27.700 に答える