2010-02-06 4 views
1

:목표 - C : 객체 초기화하고 다음 코드를 감안할 때 메모리 관리

... 나는 우리가 값을 설정하는 방법을 정말 이해 할 무엇

- (void) setTotalAmount: (NSNumber*)input 
{ 
    [totalAmount autorelease]; 
    totalAmount = [input retain]; 
} 

- (void) dealloc 
{ 
    [totalAmount release]; 
    [super dealloc]; 
} 

...

. 로컬 (인스턴스) var 및 "보유"를 var에 입력합니다. 그러나 "입력"이란 무엇입니까? 그것은 실제 가치에 대한 포인터입니까? 아니면 그 자체를 가치 있습니까? "보유"할 때 "입력"포인터 또는 값 또는 값에 대한 포인터를 얻습니까?

그리고 dealloc과 release에 대해서도 꽤 똑같은 질문이 있습니다. 실제로 여기서 죽는 것이 무엇입니까?

감사합니다.

+0

'로컬 (인스턴스) var autorelease 및 입력 var 유지'라고 말하려합니다. "할당하지 않는다"; 코드 스 니펫에 할당이 일어나지 않습니다. – erikprice

답변

3

input이 포인터임을 분명히합니다. 인수 목록에 유형을 NSNumber*으로 선언했습니다.

inputNSNumber 유형의 개체에 대한 포인터입니다. 내부적으로 오브젝트에는 외부 참조의 수를 보유하는 정수 변수가 있습니다. retain 메시지를 개체에 보내면 참조 횟수가 증가합니다. release 메시지를 보내면 카운트가 감소합니다. autorelease 메시지를 보내면 로컬 자동 릴리스 풀에 개체가 추가되어 자동 복구 된 개체를 추적하고 다음에 메시지가 유출 될 때 release 메시지를 보냅니다. release 메시지를 수신하는 참조 카운트가 1 인 객체는 할당이 해제되고 해당 메서드 dealloc이 호출됩니다. 할당을 취소 할 때 보유한 모든 자원을 해제해야합니다.

속성을 설정할 때 이전 값을 해제하고 개체 자체가 살아있는 한 새 값이 유지되도록해야합니다. 새 값이 유지되도록하려면 retain 메시지를 보내서 참조 횟수를 1 씩 늘립니다. 이전 개체를 해제하려면 릴리스 메시지를 보냅니다. 여기서 하나의 미묘한 문제가 있습니다. 이전 값이 새 값과 동일한 경우 이전 값을 먼저 해제하고 보유 개수가 1이면 증가시킬 수 있기 전에 소멸됩니다. 그래서 이전 버전을 출시하기 전에 새로운 가치를 유지해야합니다.

-1

입력이 같은 수행하여 호출되는의 NSNumber

- (void) setTotalAmount: (NSNumber*)**input** 

입니다 :

[object setTotalAmount:number]; 
+0

아니요, 'input'은 NSNumber 인스턴스에 대한 포인터입니다.구별은이 질문에 중요합니다. 그리고 당신의 예제는 컴파일되지 않을 것입니다 - 당신은'setTotalAmount'가 int 인자로 호출된다는 것을 보여주고 있습니다. 그러나 그 메소드의 인자는 NSNumber에 대한 포인터로 타입됩니다. – erikprice

+0

젠장, 난 항상 그렇게 해! –

1

당신이 "인 myObject"라는 이름의 위 클래스의 객체를 인스턴스화했다고 가정을, 당신은 설정할 수 있습니다 이 같은 그 totalAmount :

...

// get a new NSNumber object which will be autoreleased 
NSNumber *amount = [NSNumber numberWithInteger:10]; 

// call the setter which will autorelease the previous value of 
// totalAmount (if any), retain the object referenced by "amount" 
// (so that object will no longer be deallocated when it's autoreleased), 
// and reference that object from the totalAmount instance variable 
myObject.totalAmount = amount; 

...

나중에 "인 myObject"가 해제 될 때의 totalAmount 인스턴스 변수가 참조하는 개체가 발표 될 예정이다 (그리고 다른 곳에서는 유지되지 않은 경우 해제).