2017-11-22 1 views
1
var label1: UILabel? = UILabel() 

weak var label2 = label1 

label1 = nil 

여기에 약간의 혼동이다 : 이 3 개 선 후, LABEL1이 전무하지만, 여전히 참조가 라벨 2. 내 이해에서, 약한이기 때문에 그것은 nil이어야한다. 그래서 그것은 참조의 강한 파악을 가지지 않을 것이다.스위프트 약한 참조 혼란

왜이 기능이 작동하지 않습니까?

또 다른 질문 : 인터넷 요청 콜백에서

func request() { [weak self] complete in 
    guard let strongSelf = self else { return } 
    strongSelf.printSomething() 
    strongSelf.doSomething() 
} 

, 내가 약한 자기를 지정하고 가드는 자기가 해제되지 않은 경우는 성공 것입니다 있는지 확인하기 위해 strongSelf을 가지고. 문제는 가드가 지나간 후 ​​줄이 풀리면 자아가 다른 곳에서 할당이 해제되면 강해지겠습니까? 그것은 자기 자신을 강하게지지하고 있습니까? (? 자기의 메모리가 해제되지 않도록 자체로 하나의 참조 카운트를 추가)

+1

레이블을보기에 추가 했습니까? 그렇다면, 뷰는 그것에 대한 강한 참조를 가질 것이므로, label2는'nil'이되지 않을 것입니다. 귀하의 다른 질문에 대한 대답에서 예'strongSelf'는 객체가 출시되는 것을 막을 것입니다 – Paulw11

+0

@ Paulw11 아니요, 놀이터에서 첫 번째 테스트를했는데 코드의 3 줄 밖에 없었습니다. 레이블은보기에 삽입되지 않습니다. 다시 두 번째 대답은 강한 자체가 약한 자기에게 참조 횟수 +1을 더하여 잘 될 것이라는 것을 의미합니까? –

+0

당신은 이런 종류의 물건에 놀이터를 신뢰할 수 없습니다. 실제 애플 리케이션에서 테스트 – Paulw11

답변

2

를 놀이터를 사용하여,이 시도 :

class Node {} 

var node1: Node? = Node() 
weak var node2 = node1 
node1 = nil 
print(node2 ?? "node2 is nil!") 

UILabel의 다르게 행동한다 Paulw11이 제안되면서되고 있습니다, 때문에 PlaygroundPage 자체에서 유지