2016-06-22 4 views
0

이 코드를 사용하여 tableView의 표시/소실을 지연시키고 있습니다.Swift에서 타이머를 사용하여 "변수에 쓰여졌지만 읽지 않음"을 피하는 방법

var timer = NSTimer() 
    let delay = 0.5 
    timer = NSTimer.scheduledTimerWithTimeInterval(delay, target: self, selector: #selector(delayedHideTableView), userInfo: nil, repeats: false) // Warning: Variable 'timer' was written to, but never read 

아마도 내가 타이머 변수에 문제가 있습니다. 어떻게이 오류를 피할 수 있습니까? print (timer) 문을 사용할 수는 있지만 최선의 방법이라고 생각하지는 않습니다.

답변

3

변수가 필요하지 않으므로 timer 변수를 만들지 마십시오. 다음을 수행하십시오 :

NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: #selector(delayedHideTableView), userInfo: nil, repeats: false) 

동적으로 변경하지 않는 한 delay 변수가 필요하지 않습니다.

2

예제에서 NSTimer에 대한 변수가 필요하지 않습니다. 그래서 당신은 삭제할 수 있습니다

var timer = NSTimer() 

사용자 코드는 이미 거기에서 타이머를 시작했다는 것을 지적했습니다. 이 변수를 필요로하는 경우 그래서 당신은 오히려 타이머를 시작하지만, 올바른으로 속성의 유형을 설정하지 않습니다

var timer:NSTimer 

이 작업을 수행해야합니다.

let delay = 0.5 
NSTimer.scheduledTimerWithTimeInterval(delay, target: self, selector: #selector(delayedHideTableView), userInfo: nil, repeats: false) 

와 경고가 사라질 것 :

은 그러나 문제에 대한 짧은 대답은 당신이 단지 같은 코드 모양을 만들 수 있다는 것입니다.

4

클래스가 deinit이거나 뷰가 제거 될 때 항상 타이머를 무효화해야합니다. 그렇지 않으면 미래에 찾기 힘든 메모리 충돌이 발생할 수 있습니다.

그래서 그냥 추가 :

deinit { 
    self.timer.invalidate() 
} 

를 클래스에.

나는 타이머, 관찰자 ​​등을 기쁘게하지 않기 때문에 많은 이상한 버그를 보아왔다. 좋은 습관을 지켜라. 코드에서

+2

'NSTimer' 따라서, 목표는 유지 (및 런 루프 타이머를 보유) 유지할'deinit 인 '타이머가 활성화되어있는 한 절대로 호출되지 않습니다. 객체 라이프 사이클의 적절한 시간에'invalidate()'를 수동으로 호출해야합니다. 이 경우 OP의 타이머가 반복되지 않기 때문에 대상은 해고 될 때까지만 유지됩니다. – Hamish

+1

흥미롭게도, 나는 반복 된 타이머에서 많은 일을했지만, 반복되지 않는 타이머에서는 거의 작동하지 않았습니다. 따라서이 상황에서 중요한지 확실하지 않습니다. 그냥 호기심, 타이머가 초기화 된 다음 superview에서 tableView가 어떻게 든 제거되면 타이머가 해고되면 문제가 발생합니까? tableView가 여전히 메모리에 있는지 여부. –

+0

타이머는 활성 상태 인 동안 대상을 계속 유지하므로 주어진 대상에 대한 참조가없는 경우에도 타이머가 유지합니다. 말하자면, deallocat (ed/ing) 객체에 대해 메소드를 호출하여 발생할 수있는 문제를 방지하는 것입니다. 이 문제를 피할 방법을 찾고 있다면'CFRunLoopTimer'을 살펴보십시오 - 이것은 타겟과 셀렉터가 아닌 콜백으로서 클로저를 취할 수 있습니다. – Hamish

4

은 몇 가지 문제가 있습니다 : 당신이 그 값을 덮어 쓰는 아래

  1. 당신은 변수로 timer를 선언, 당신은 NSTimer() 2 라인을 채우고있다. 그렇다면 NSTimertimer에 처음으로 할당하는 이유는 무엇입니까?

  2. NSTimer.scheduledTimerWithTimeInterval(...)에 의해 반환 된 값을 사용하지 않으면 왜 timer에 저장합니까?

  3. 마지막으로 NSObject을 상속받지 않는 클래스에 selector를 사용하는 메서드를 호출하려면 해당 메서드를 @objc으로 노출해야합니다.

  4. #selector 대한 올바른 신택스 사실 그래서 #selector(ClassName.methodName)

class Foo { 

    func foo() { 
     let delay = 0.5 
     NSTimer.scheduledTimerWithTimeInterval(delay, target: self, selector: #selector(Foo.delayedHideTableView), userInfo: nil, repeats: false) 
    } 

    @objc func delayedHideTableView() {} 
}