문제

나는 그것을 배웠다 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에서 수행 된 작업이 실행되지 않을 것이라는 것을 알고 있기 때문에 :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top