2017-10-21 4 views
1

awakeFromNib 함수에서 로컬 변수를 만들고 UIView 애니메이션 블록 내부에서 사용합니다. 그러나 결코 릴리스되지 않습니다. 이유는 무엇입니까? jQuery과가 해제되지 않습니다 그래서 여기 스위프트,이 로컬 var가 출시되지 않은 이유는 무엇입니까?

따라서있는 UITableViewCell은 결코

var fullPhotoDisposeBag = DisposeBag() 
fullScreenImageView.rx.tapGesture().when(UIGestureRecognizerState.recognized).subscribe(onNext: { (tap) in 

     UIView.animate(withDuration: 0.15, delay: 0, options: UIViewAnimationOptions.curveEaseOut, animations: { 
      fullScreenImageView.frame = oldFullScreenFrame 
     }, completion: { (finished) in 
      fullScreenImageView.removeFromSuperview() 
      let _ = fullPhotoDisposeBag //This line avoid early release, but retains too much... 
     }) 
}, onDisposed:{ 
     print("disposed") 
}).addDisposableTo(fullPhotoDisposeBag) 

하나의 단서가있는 tableView 내 응용 프로그램의 하나 개의 탭의 루트에 있다는 것이다 (A있는 UITableViewCell에로 awakeFromNib 내부) 코드입니다 재사용으로 인해 할당이 해제되었습니다. 그러나 ARC가 왜 그 변수를 유지합니까? 함수와 완료 블록에서만 사용됩니까?

PS : 나는 현재 내가 완료 블록에서 전무로 설정 옵션 DisposeBag를 사용하지만, 내가 그렇게해야하는 이유 이해가 안 ...

답변

1

이 유지 사이클처럼 보인다. 내 생각 엔 가비지 컬렉터는 완성 클로저가 참조를 멈추고 로컬 함수가 소유하고 있기 때문에 완료 클로저가 해제되지 않는 한 로컬 변수를 해제하지 않을 것입니다.

이 코드를 UIView에서 UIViewController로 옮기는 것이 좋습니다.이 코드는 이러한 종류의 동작을 정의해야하는 곳이기 때문에 좋습니다.

+0

감사합니다. 그게 내가 생각한 것입니다. 불행히도 viewController, 코드를 이동합니다 불행히도 rxSwift 함께 disposeBag 선택적 선언하는 것보다 다른 방법으로, disposeBag 추가 할 때 unwrap ("!"사용하여 싫어) 다음 disposeBag 애니메이션이 끝나면 무효로하겠습니다. – Devous

+0

완성 블록에서'fullPhotoDisposeBag = DisposeBag()'를 수행하는 것은 어떻습니까? 원래의'DisposeBag'을 비우고 유지주기를 깨고'Optional'을 사용하지 않아도됩니다. –

관련 문제