2017-10-13 4 views
1

ViewController를 나갈 때 UIview를 제거하기 위해 메모리를 관리하고 싶습니다.
그리고 "약한"키워드를 사용하려고하는데 chatkeyboard가 없으므로 충돌이 발생합니다.
나는 왜 그것을 추락시키는 지 모른다.
감사합니다.
내가 왜 uiview를 초기화하고 uiview도 신속하게 초기화할까요?

class ChatKeyboard: UIView { 

var buttonMic:UIButton = {()->UIButton in 
    let ui:UIButton = GeneratorButton() 
    return ui 
}() 

override init(frame: CGRect) { 
    super.init(frame: frame) 
    print("===) ChatKeyboard init.") 
    translatesAutoresizingMaskIntoConstraints = false 
    loadContent() 
    loadConstrain() 
} 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
} 

deinit { 
    print("===) ChatKeyboard deinit.") 
} 

func loadContent() { 

backgroundColor = UIColor.white 
addSubview(buttonMic) 
} 

func loadConstrain() { 

buttonMic.snp.makeConstraints { (make) -> Void in 
      make.left.equalTo(micLeftPadding) 
      make.top.equalTo(micTopPadding) 
      make.width.equalTo(UIScreen.main.bounds.width*0.0581) 
      make.height.equalTo(UIScreen.main.bounds.height*0.045) 
} 
} 
} 


class ChatroomViewController: UIViewController{ 

weak var chatKeyboard:ChatKeyboard? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    chatKeyboard = ChatKeyboard(frame: CGRect(x: 0, y: 0, width: 300, height: 44)) 
} 
} 

는 I은 브레이크 포인트를 설정 "chatKeyboard = ChatKeyboard (: CGRect (X : 프레임 0, Y : 0, 폭 : 300, 높이 : 44))"및 내 로그 인쇄 :

===) ChatKeyboard init. 
===) ChatKeyboard deinit. 

답변

1

이유는

당신의 ViewController는로드 뷰에 대한 강한 참조를 보유하지 의미
weak var chatKeyboard:ChatKeyboard? 

같은 chatKeyBoard를 선언한다. 따라서보기의 참조 횟수는 달라지지 않습니다. 당신의 viewDidLoad

override func viewDidLoad() { 
    super.viewDidLoad() 

    chatKeyboard = ChatKeyboard(frame: CGRect(x: 0, y: 0, width: 300, height: 44)) 
} 

에서

당신은보기를 인스턴스화하지만 뷰가 약하게 즉시 컨트롤이있는 viewDidLoad ARC의 범위를 벗어나으로 개최되었다 때문에보기를 발표했다.

당신의 viewDidLoad가

var chatKeyboard:ChatKeyboard? 

이 더 강한 참조로이없는 같이 weak 변수가 즉시 파괴 될 것

3

희망이 도움이 강한에게에 refrence를 선언라는 후에도보기 액세스하려면, 그것.

뷰를 생성하여 weak 변수에 직접 지정하면 뷰가 즉시 삭제됩니다. 약한 IBOutlet은 전에 앞에 superview (강력한 참조 만들기)에 추가되어 변수에 할당되기 때문에 작동합니다. 귀하의 재산에 할당하기 전에 로컬 변수를 사용하여이 작업을 수행 할 수 있습니다 : 그러나

let keyboard = ChatKeyboard(...) 
view.addSubview(keyboard) 
chatKeyboard = keyboard 

, 그것은, 대한 관심 뷰에 대한 강한 참조를 가진 뷰 컨트롤러에 전혀 해가없는만큼 그 전망이되지도처럼 보기 컨트롤러에 대한 강력한 참조를가집니다. 뷰 컨트롤러가 파괴되면 그들은 파괴 될 것입니다.

0

클래스 또는 구조에서 동일한 클래스 또는 구조에서 초기화 할 속성을 설명하는 데 "약한"키워드를 사용하지 마십시오.