2009-11-19 7 views
6

우리가 종종 ab 객체를 릴리즈 할 때 우리는 즉시 그것을 nil로 설정합니다. 저는 release와 nil이 모두 객체와 연관된 이전 값을 해제한다는 것을 알고 있습니다. 그러나 release의 경우 객체를 매달려있는 포인터로 남겨 둡니다. 그래서 우리는 그것을 nil로 설정해야합니다.왜 우리가 출시해야합니까?

제 질문은 nil이 객체의 이전 값을 해제하고 객체를 nil으로 설정하면 왜 n이 사용되지 않아야 만하는지 w가 release를 사용해야하는 이유입니다.

Way1 :

MyClass *obj = [[MyClass alloc] init]; 
[obj release]; 
obj = nil; 

Way2 : 사용 way1 이유는 단지 way2를 사용하지 않는 경우

MyClass *obj = [[MyClass alloc] init]; 
obj = nil; 

way1 및 way2의 실제 차이점은 무엇입니까?

+1

좋은 질문 ... 주목할만한 예외가 여기에있다 – tek3

답변

11

포인터를 nil로 설정해도 포인터의 이전 대상이 차지한 메모리는 해제되지 않습니다. 보통 영어로 nil에 할당하면 이 아닌이 릴리스됩니다.

응용 프로그램이 가비지 수집되는 경우 릴리스는 아무 작업이 아니므로 생략 할 수 있습니다. 그렇지 않으면 매우 필요합니다. 따라서 Way 1은 항상 정확하며 Way 2는 가비지 수집에서만 정확합니다.

참고 :이 참조는 자동 참조 횟수 계산을 사용하는 프로젝트에는 적용되지 않습니다. ARC에서 포인터를 nil 으로 설정하면이 개체에 릴리스를 보냅니다.

+4

것 '@property (retain)'**와 ** 접근자를'@ synthesized '하면, 그 접근 자 메소드는 할당 한 객체를 유지하고 해제하는 것을 처리 할 것입니다. 물론 이것은 접근 자 메서드를 사용하는 경우에만 작동합니다 :'[self setObj : nil]'또는'self.obj = nil' (objc-2.0의 경우). –

1

그것은 BJ가 nil로 설정하면 메모리가 확보되지 않고 gc가 수집되지 않은 환경에서는 메모리 누수가 발생할 것이라고 BJ가 말했습니다. **는 인스턴스 변수 인 경우 ** **와 **가 선언되었습니다 가능성뿐만 아니라 유효했던 대안은

MyClass *obj = [[[MyClass alloc] init] autorelease]; 

obj = nil;