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은 더 나은 퍼터를 사용합니까?
후, 제 2 기술은 표제가 오토 릴리즈되기 때문에 충돌을 일으키지 않을 것이다 새 제목이 다른 경우 두 번째 설정자가 빠릅니다. 이전 제목이 즉시 발표되지 않기 때문에 더 많은 메모리를 사용합니다. – ughoavgfhw
@ughoavgfhw : dealloc에서 접근자를 사용하는 것은 적절하지 않습니다. 사실 Apple과 대부분의 코코아 프로그래머는 나쁜 관행으로 간주합니다. – Chuck
@chuck 기술 1에서 getter에 액세스 한 다음 해제하면 충돌이 발생합니다. – Remover