-
weak property에 클래스 초기화구문을 대입하면 OOO. (안된다)앱등이에게 살충제를 뿌린다./iOS 2016. 4. 7. 18:39
<절대로 weak 프로퍼티를 무시하지 마라>
let frame = CGRect(x: 0, y: 0, width: 100, height: 100) weak var myButton: UIButton! var myButtonNotWeak: UIButton! override func viewDidLoad() { myButton = UIButton(frame: frame) myButtonWithoutWeak = UIButton(frame: frame) }
라는 코드가 있다고 할 때,
myButton은 nil이 되고
myButtonWithoutWeak는 UIButton객체를 갖게 된다.
이게 왜 문제냐면..
이 코드가 아래와 같았다면?
let frame = CGRect(x: 0, y: 0, width: 100, height: 100) weak var myButton: UIButton? var myButtonNotWeak: UIButton? override func viewDidLoad() { myButton = UIButton(frame: frame) myButtonWithoutWeak = UIButton(frame: frame)
view.addSubview(myButton!)
view.addSubview(myButtonWithoutWeak!)}
nil을 force unwrapping을 하기 때문에 앱이 크래쉬가 난다.
1. 원인
weak variable은 Retain Count를 증가시키지 않기 때문에 초기화한 객체를 weak var에 대입하고 넘어가는 순간,, 방금 초기화한 객체를 어디에서도 참조하고 있지 않기 때문에 weak var는 이 객체를 붙잡고 있지 않는다.
2. 해결 방안
강한참조를 해줄 tmp변수를 사용했다. (전 tmp를 쓰는걸 좋아하지 않아서 다른 방식으로 해결하긴했습니다. 더 더럽게)
let frame = CGRect(x: 0, y: 0, width: 100, height: 100) weak var myButton: UIButton! override func viewDidLoad() { let tmp = UIButton(frame: frame) view.addSubview(tmp) myButton = tmp }
3. PS
(사수가 해준 말)
객체가 메모리상에서 바로 사라지는게 아니라 GC 알고리즘을 통해서 사라질텐데, 이 사라지는 타이밍에 따라 크래쉬가 나지 않기도 했었다.
하지만 원칙적으로는 안하는게 당연하다.
참조 : http://stackoverflow.com/questions/26137247/why-does-the-initialization-to-weak-return-nil-in-swift
'앱등이에게 살충제를 뿌린다. > iOS' 카테고리의 다른 글
[Raywenderlich - iOS/Swift] Alamofire 사용하기 (7) 2016.04.15 [Raywenderlich - iOS] NSURLSession 사용 가이드 (3) 2016.04.11 [NSHipster - iOS] 객체의 동등성 Equality 와 Identity에 대하여 (0) 2016.01.26 [iOS] NSURLConnection이 deprecated되었기에 우리는.. (0) 2016.01.26 [NSHipster - iOS] Enumeration,Iteration,Traverse.. 반복문의 퍼포먼스에 대해 알아보자 (0) 2016.01.22