2012-02-20 3 views
2

우리가 예를 들어, 그것을 할 방법 세터의 많은 예제가 있습니다불필요한 자료는

- (void)setFoo:(NSString *)newFoo 
{ 
    if (foo != newFoo) 
    { 
     [foo release];//?? 
     foo = [newFoo retain]; 
    } 
} 

나는 우리가 이전 값을 해제 한 후 유지와 새를 지정해야 이해 해요, 그건 방법 문서는 우리에게 말하지만, foo = [newFoo retain]을 지정하면, 우리는 배포해야 할 것을 이해할 수 없다. newFoo의 현재 보유 카운터로 foo를 단지 새로운 값으로 만들 것입니다. foo의 보유 카운터조차도 5가되기 전에 newFoo의 +1이되거나 잘못된 것을 이해하고 이해할 것입니다. 우리가 할 수없는 이유 :

- (void)setFoo:(NSString *)newFoo 
{ 
    if (foo != newFoo) 
    { 
     foo = [newFoo retain]; 
    } 
} 

답변

1

Objective-C는 포인터와 함께 작동합니다 (모든 것은 포인터입니다).

retain 또는 release을 수행 할 때 참조/포인터 (변수 이름)에서는 수행하지 않고 실제 객체 자체에서는 수행하지 않습니다.

그 이유는 우리가 이전 개체를 릴리스해야하기 때문이며 (변수를 완료했기 때문에) 변수를 새로운 개체로 지정해야합니다. 그런 다음 다른 개체에 의해 제거되지 않도록 retain 카운트를 늘립니다. . 의미

+0

오 10x, 알겠습니다. 사실 우리는 var가 아니라 메모리 셀을 풀어 줄 필요가있다. –

0

foo를 만드는

희망 포인터 (메모리 주소) 메모리에 저장되어있는 NSString 객체를 가리키는 것입니다. 이 setter 함수가 시작되면 메모리에 두 개의 NSString 객체가 있습니다. 하나는 foo가 가리키고 retain하고 다른 하나는 인수로 전달됩니다. 각 객체는 고유 한 보유 수를가집니다.

foo == newFoo는 포인터가 이전 NSString을 가리키는 것을 중지하고 새 포인터를 가리 키도록 지시합니다.

포인터를 변경하기 전에 첫 번째 개체를 놓지 않으면 메모리 누수가 발생합니다. 이전 객체는 아무 것도 가리 키지 않습니다 (프로그램에서 알 수있는 한 존재하지 않습니다). 그러나 보유 수는 0에 도달하지 않고 계속 유지되므로 할당이 해제됩니다.

+0

10x, 좋은 소리, 내 머리를 버린다. –