2009-05-17 4 views
0

저는 Aaron Hillegass의 저서, 특히 복권 예를 통해 연구하고 있습니다. -setEntryDate: 메서드에 대한 질문이 있습니다. 왜 date을 보유해야합니까? 프로그램은 여전히 ​​그것을 유지하지 않고 작동합니다.Cocoa 왜 함수 매개 변수를 유지하고 해제해야합니까?

-(void)setEntryDate:(NSCalendarDate *)date { 
    [date retain]; 
    [entryDate release]; 
    entryDate = date; 
} 

그러나 이것은 여전히 ​​잘 작동 :

-(void)setEntryDate:(NSCalendarDate *)date { 
    entryDate = date; 
} 

왜이 올바른지 내가 date을 유지하고 entryDate를 해제해야한다는?

+0

덧붙여 말하자면 메서드 이름이 "date"이고 매개 변수의 이름이 "date"이지만 형식이 NSCalendar 인 것처럼 보입니다. NSCalendar는 상상력에 의한 날짜가 아닙니다. NSDate를 사용하셨습니까? – Chuck

+0

나는 실제로 NSCalendarDate를 지적했다. – Brad

답변

7

지금은 작동하지만 더 큰 프로그램을 작성하는 경우 나중에 결정할 수없는 지점에서 setEntryDate이라고하는 사람이 date 지점을 가리킬 가능성이 있습니다. 그런 일이 발생하면 나머지 프로그램에서 무효화됩니다. 이 클래스는 이제 해당 객체에 대한 참조를 소유하고이를 나타낼 필요가 있으므로 클래스에서이 객체를 보유합니다. 이렇게하면 setEntryDate이라는 클래스가 date을 릴리스하더라도 클래스는 계속 유효한 참조를 유지합니다. 또한, 이것은 여러분이 작성하는 일반적인 오래된 방법이 아닙니다. 이 클래스는 인스턴스 변수가 속한 클래스에서 인스턴스 변수를 설정하는 특정 책임이있는 설정자입니다. setter가 아닌 메서드를 작성하는 경우 매개 변수를 유지하지 않아도됩니다. 제가 말하고자하는 것은 메서드 매개 변수를 유지하는 것이 항상 필요한 것은 아니라는 것입니다. 그것은 단지이 경우에 해당됩니다 (그리고 비 기본 유형을 다루는 모든 세터들과 함께).

이것은 "참조 횟수"라고 불리우며 자세한 내용은 here입니다. 지금은 배우기 시작한 이래로 아직 읽는 것에 대해 걱정하지 마십시오. 메모리 관리로 더 ​​복잡한 시나리오에 들어가기 시작하면이 안내서는 매우 가치있는 독서 과제입니다.

+0

응답 마크 (Marc)에게 감사드립니다. – Brad

3

개체의 소유권을 주장하고 있기 때문에 retain은이 작업을 수행하는 방법입니다. 잘못된 코드가 올바르게 작동하는 경우가 있지만, 이는 실제로 운이 좋은 것입니다.

the Cocoa memory management rules을 참조하십시오.

+2

이것은 정말로 정답입니다. 다른 수업이하는 일에 대해 걱정하지 마십시오. 고려해야 할 유일한 것은 "이 객체를 소유할까요?"입니다. 그렇다면 복사본을 만들거나 (이 경우 복사본을 소유하고있는 경우) 또는 보유하게됩니다. 그렇지 않다면, 당신은하지 않습니다. 그것은 간단합니다. –

1

이러한 메서드를 접근 자 메서드이라고합니다. 이름에서 알 수 있듯이 변수를 검색하고 설정할 수 있습니다. 특히 변수를 "getter"및 "setters"라고합니다.

컨벤션, 예를 들어, 변수에 대한 "게터"를 호출하는 것입니다라는 NSString (당신은 그러나 책의 뒷부분에서 볼 수, 컨벤션 이상입니다) foo

- (NSString*)foo; 

그리고 "setter":

- (void)setFoo:(NSString*)newFoo; 

위의 예제에서 메서드는 새 날짜 값을 설정하기 위해 구현됩니다. 메모리 관리는 4 장에서 설명합니다. 간단히 말해서 Objective-C 객체의 작동 방식은 객체에 "참조 횟수"가 있다는 것입니다. 이는 객체의 참조 수를 나타냅니다. 할당되면 개체의 보유 개수는 1입니다. 개체에 retain 또는 release 메시지를 보내고 보유 개수를 늘리거나 줄일 수 있습니다. retain 메시지는 메시지를 보내는 개체가 개체를 사용하기를 원하므로 retain입니다. A release 메시지는 메시지를 보내는 개체가 더 이상 개체를 사용하지 않으므로 보유 수를 줄임을 의미합니다.오브젝트의 보유 수 (Retain Count)가 0에 도달하면, 오브젝트의 할당이 해제됩니다. 이 방법으로 메모리 누수가 방지됩니다.

date이 보유되고 entryDate이 릴리스되는 이유는 "알 수있는"새로운 개체 인 date입니다. 따라서 귀하는 retain로 소유권을 주장하고 있습니다. entryDate 변수는 현재 날짜 객체를 가리키고 있지만 새로운 값으로 설정했기 때문에 더 이상 알 필요가 없습니다. 그러므로 당신 release 그것; 이것은 원래이 변수를 유지할 것이므로 메모리 누수를 방지합니다.

이전에 말한 것처럼 4 장 : 메모리 관리을 읽으면 개념이 훨씬 명확 해집니다. 지금 당장은 그것을 받아들이고 그것이 설명 될 때 배후의 추론을 이해하십시오.

1

동영상으로 더 잘 배우면 스탠포드 대학은 published 아이폰 개발에 관한 비디오를 제공합니다.이 비디오는 또한 코코아와 목표 C를 어느 정도 커버합니다. 강의 3을 살펴보고, 예제와 토론을 통해 메모리 관리에 대한 좋은 개요를 만든다.

관련 문제