2017-04-22 1 views
1

내 단추를 만들고 대상 동작을 추가하는 ButtonProvider 클래스가 있습니다. 그러나 단추를 누를 때 해당 단추를 만든 클래스 ButtonProvider에서 함수를 호출하는 대신 다른 클래스의 같은 이름 가진 함수를 호출합니다. 잘못된 클래스에서 UIButton 함수가 호출됩니다.

class ButtonProvider { 

    let view: UIView! 
    let button: UIButton! 

    init(view: UIView) { 
     self.view = view 
    } 

    func showButton() { 
     button = UIButton(frame: CGRect(x: 0, y: 0, width: 50, height: 50)) 
     button.backgroundColor = .white 
     button.addTarget(self, action: #selector(ButtonProvider.close), for: .touchUpInside) 

     view.addSubview(button) 
    } 

    @objc func close() { 
     button.removeFromSuperview() 
    } 

} 

그리고 나의 ViewController 전화에

:

override func viewDidLoad() { 
    let buttonProvider = ButtonProvider(view: self.view) 
    buttonProvider.showButton() 
} 

@objc func close() { 
    //This is the function that is called 
} 

ButtonProvider.close의 선택 내 ViewController.close 함수를 호출하는 이유가 뭘까요?

+1

'buttonProvider'는 유지되지 않으므로 할당이 해제됩니다. 나는 응용 프로그램이 충돌하지 않는 것에 놀랐다. – Sulthan

+0

#selector (닫기) 대신 #selector (ButtonProvider.close)를 사용하는 이유는 무엇입니까? –

+0

@DmytroShvecov 동일합니다. – Sulthan

답변

1

buttonProvider은 컨트롤러가 소유하지 않으므로 viewDidLoad이 끝나는 즉시 할당이 취소됩니다. 버튼을 누르면 인스턴스가 메모리에 더 이상 존재하지 않으며 그 결과는 정의되지 않은 동작, 일반적으로 충돌이됩니다.

buttonProvider을 컨트롤러의 강력한 속성으로 저장해야합니다.

+0

정말 고마워. 매우 도움이됩니다. –

관련 문제