2011-01-08 3 views
4

Apple의 Memory Management Programming Guide은 객체 참조를 유지하거나 해제해야하는 접근 자 메서드를 작성하기 위해 공식적으로 승인 된 세 가지 기법을 보여줍니다.이러한 상황에서 어떤 메모리 관리 기법이 더 좋은가?

처음 두 가지 기술 (아래에서 재현)의 경우 Apple 문서에 따르면 "기술 2의 성능은 getter가 세터보다 훨씬 자주 호출되는 경우 기술 1보다 훨씬 뛰어납니다 . "

// Technique 1 
- (NSString*) title 
{ 
    return [[title retain] autorelease]; 
} 

- (void) setTitle: (NSString*) newTitle 
{ 
    if (title != newTitle) 
    { 
     [title release]; 
     title = [newTitle retain]; // Or copy, depending on your needs. 
    } 
} 

// Technique 2 
- (NSString*) title 
{ 
    return title; 
} 

- (void) setTitle: (NSString*) newTitle 
{ 
    [title autorelease]; 
    title = [newTitle retain]; // Or copy, depending on your needs. 
} 

이 기술 1 기술 2 사이의 유일한 차이, 또는 다른 이상 하나가 내가 인식해야 할 수도있는 미묘한 결과를 사용 하는가? 그리고 만약 기술 2가 더 나은 수행을하는 게터를 사용한다면, title이 명시 적 (그리고 아마도 아마도 즉각적인) 릴리즈를 얻게되기 때문에 기술 1은 더 나은 퍼터를 사용합니까?

답변

0

두 번째 게터가 깨지기 쉽습니다 (누군가 액세스 할 때 해당 객체의 title을 놓은 다음 충돌이 발생하면 충돌이 발생하므로 일반적으로 속도가 조금 느리더라도 첫 번째 게 좋습니다).

첫 번째 설정 도구가 더 효율적이며 자동 복구 풀이없는 상황에서도 작동하므로 바람직합니다. 더 효율적인 이유는 autorelease 대 릴리스 때문 만은 아닙니다. 속성을 기존 값으로 설정하려고하면 아무런 작업도 수행하지 않습니다.

+0

후, 제 2 기술은 표제가 오토 릴리즈되기 때문에 충돌을 일으키지 않을 것이다 새 제목이 다른 경우 두 번째 설정자가 빠릅니다. 이전 제목이 즉시 발표되지 않기 때문에 더 많은 메모리를 사용합니다. – ughoavgfhw

+0

@ughoavgfhw : dealloc에서 접근자를 사용하는 것은 적절하지 않습니다. 사실 Apple과 대부분의 코코아 프로그래머는 나쁜 관행으로 간주합니다. – Chuck

+0

@chuck 기술 1에서 getter에 액세스 한 다음 해제하면 충돌이 발생합니다. – Remover

1

2의 게터 및 1 세터 다음 할당 해제의 방법은 적절하게 접근 통해 변수를 클리어하면

- (NSString*) title 
{ 
    return title; 
} 

- (void) setTitle: (NSString*) newTitle 
{ 
    if (title != newTitle) 
    { 
     [title release]; 
     title = [newTitle retain]; // Or copy, depending on your needs. 
    } 
} 
관련 문제