2011-02-12 3 views

답변

10

이 메모리 관리 프로그래밍 가이드에서입니다 :

기술 기술 1에서 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. 
    } 
} 

get 접근자는 현재 범위에서 자동으로 해제되며 속성 값이 변경되면 유효한 상태로 유지됩니다. 이렇게하면 접근자를 더 강력하게 만들 수 있지만 추가 오버 헤드가 발생합니다. getter 메소드가 자주 호출되기를 기대한다면, 객체를 유지하고 자동 갱신하는 데 드는 추가 비용은 성능 비용의 가치가 없을 수도 있습니다.

는 기술 기술 1을 추천 는 기술 2는 오토 릴리즈 기술을 사용하지만, 이번에는 setter 메소드에 그렇게 :

- (NSString*) title { 
    return title; 
} 

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

이 기술 2의 성능은 상황 곳에서 기술 1보다 훨씬 낫다 getter는 setter보다 훨씬 자주 호출됩니다.

기술 3 기술 (3)는 모두 오토 릴리즈의 사용을 피할 수 :

- (NSString*) title { 
    return title; 
} 

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

기술 3에서 사용하는 방법은 자주 호출 getter와 setter 메소드에 좋습니다. 또한 컬렉션 클래스와 같이 값의 수명을 연장하지 않으려는 객체에 적합합니다. 단점은 기존 값이 다른 소유자가없는 경우 즉시 할당 해제 될 수 있기 때문에 다른 객체가 비 소유자 참조를 유지 관리하는 경우 문제가 발생할 수 있다는 것입니다. 예 :

anObject가 원래 제목 문자열을 소유 한 유일한 개체이면 새 제목이 설정된 후에 문자열이 할당 취소됩니다. 그런 다음 oldTitle은 해제 된 객체이므로 로그 문은 충돌을 일으 킵니다.

EDIT : 기본적으로 유지 지점과 자동 해제 지점은 호출 범위가 유지하기 전에 속성 값이 변경되면 개체가 할당 해제되지 않도록합니다. 비동기 코드가 없으면 일반적으로 문제가되지 않습니다. 대부분의 경우 - (Weapon *)myWeapon { return myWeapon; }은 괜찮습니다 (더 빨라짐).

+0

우수 답변, 저에게서 유용한 자료를 배웠습니다. – Dave

+0

백만 THX Rich, 마지막 질문 :이 기술은 getters 및/또는 setter에서만 권장됩니다. ??? – Malloc

+0

게터와 세터는 무엇을 의미합니까? 다른 곳에서는 사용하고 싶습니까? getter와 setter를 사용하는 대신 ok를 수행하는지 묻는다면 대답은 no입니다. vars가 읽기 전용이 아닌 한 항상 getter와 setter를 사용하십시오.이 경우 기술 3을 사용해야합니다 (또는 객체가 아닌 경우에만 할당하십시오.C 데이터 유형)을 사용하여 이니셜 라이저에 변수를 설정합니다 (읽기 전용 변수는 변경되지 않으므로 자동 릴리즈 할 필요가 없습니다). – Rich