NIL 설정과 방출 간의 대상 C 차이
-
06-07-2019 - |
문제
나는 그것을 배웠다 dealloc
당신은합니다 [object release];
그러나 viewDidUnload
(UIViewController 서브 클래스에서) 당신은 그렇게합니다 self.object = nil
. 실제로 차이점은 무엇입니까? self.object = nil
(우리는 객체가 a라고 가정합니다 (nonatomic, retain)
재산) 유지 nil
(아무것도하지 않는) 이전 값을 출시 한 다음 참조 수가 0인가요?
해결책
self.object = nil
구식 값을 공개하는 세터를 호출하여 멤버를 nil
, 아마도 다른 일을 할 수 있습니다 (방법이므로 무엇이든 할 수 있습니다). 그 "무엇이든"부분은 잠재적으로 위험합니다. 보다 이 질문, 예를 들어.
[object release]
기존 값을 발표하지만 멤버를 지금 방해하는 포인터로 남겨 둡니다. 이는 버그에 대한 좋은 레시피입니다. ~ 안에 dealloc
포인터 자체가 사라질 것이기 때문에 실제로는 중요하지 않지만 다른 경우에는 회원을 설정하지 않고 멤버를 릴리스하는 것이 매우 나쁜 생각입니다. nil
.
(사이드 니트로서, 객체를 발매하면 참조 수를 0이라고 가정해서는 안됩니다. 참조를 공개하지만 다른 객체는 여전히 참조를 가질 수 있습니다.)
다른 팁
당신이한다면 object = nil
없이 [object release]
, 그것은 메모리 누출을 유발할 수 있습니다. 당신이한다면 [object release]
없이 object = nil
그 후 @jim이 제안한대로 물체가 매달려 포인터가됩니다. self.object = nil
세터 기능 호출을위한 설탕입니다.
객체 릴리스]를하고 객체에 액세스하려면 앱이 단순히 충돌합니다. 객체 = nil을하고 객체에 액세스하려면 아무것도 수행하지 않습니다.
그 이유는 [객체 릴리스]에 있으므로 객체를 풀려고 시도합니다. 그래서 그것은 포인터가 없습니다 (memoty 없음). object = nil,
널 포인터로 객체를 할당하려고합니다. 따라서 객체에 접근하려고하면 아무 일도 일어나지 않을 것입니다.
일반적으로 우리는 코드를 [object release]; object = nil;
U가 예기치 않게 객체에 액세스하면 앱이 충돌하지 않기 때문입니다.
객체를 풀면 해제 된 객체가됩니다.
Freed 객체에서 모든 종류의 작업을 수행하려고하면 앱이 충돌합니다. 그러한 사고를 피하기 위해 항상 "객체를 공개 한 후에 물체를 지정하십시오"라는 것이 선호됩니다. 우리는 모두 NIL에서 수행 된 작업이 실행되지 않을 것이라는 것을 알고 있기 때문에 :)