이 메모리 관리 프로그래밍 가이드에서입니다 :
기술 기술 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; }
은 괜찮습니다 (더 빨라짐).
우수 답변, 저에게서 유용한 자료를 배웠습니다. – Dave
백만 THX Rich, 마지막 질문 :이 기술은 getters 및/또는 setter에서만 권장됩니다. ??? – Malloc
게터와 세터는 무엇을 의미합니까? 다른 곳에서는 사용하고 싶습니까? getter와 setter를 사용하는 대신 ok를 수행하는지 묻는다면 대답은 no입니다. vars가 읽기 전용이 아닌 한 항상 getter와 setter를 사용하십시오.이 경우 기술 3을 사용해야합니다 (또는 객체가 아닌 경우에만 할당하십시오.C 데이터 유형)을 사용하여 이니셜 라이저에 변수를 설정합니다 (읽기 전용 변수는 변경되지 않으므로 자동 릴리즈 할 필요가 없습니다). – Rich