2011-01-22 3 views
2

저는 여전히 객관적으로 새로운 것을 알고 있습니다.-c.함수가 객체를 생성하고 반환하는 경우, 자동 해제 풀에 있어야합니다.

내가 이해할 수있는 한, alloc, new, copy 또는 mutableCopy에서 가져 오지 않은 객체는 autorelease 풀에 있다고 가정해야합니다.

개체의 새 인스턴스를 만들고 반환하는 함수를 만들면이를 반환하기 전에 autorelease 풀에 배치해야한다고 가정합니다.

예를 들어 xml을 파싱하고 xml의 데이터를 나타내는 개체를 반환합니다.이 개체는 반환하기 전에 autorelease 풀에 있어야합니다.

내 관심사는 iPhone 개발이지만 일반적인 대답은 감사하겠습니다.

답변

3

두 가지 방법, 즉 호출자가 소유 한 객체를 반환하거나 호출자가 소유하지 않은 객체 (예 : 자동 다시 불러 오기 객체)를 반환 할 수 있습니다. 어떤 전략을 선택하든 관계없이 이름 지정 규칙을 따르십시오. 예를 들어,

- (NSString *)fullNameCopy { 
    return [[NSString alloc] initWithFormat:@"%@ %@", self.firstName, self.LastName]; 
} 

은 발신자가 소유 한 NSString 개체를 반환합니다. 메서드 이름은 fullNameCopy이며 이름 지정 규칙을 따릅니다. 이름에 'copy'가 포함 된 메서드는 호출자가 소유 한 개체를 반환합니다. 반환 값은 자동 회수 풀에 저장되지 않습니다.

또는

,

- (NSString *)fullName { 
    return [NSString stringWithFormat:@"%@ %@", self.firstName, self.LastName]; 
} 

또는

- (NSString *)fullName { 
    NSString *s = [[NSString alloc] initWithFormat:@"%@ %@", self.firstName, self.LastName]; 
    return [s autorelease]; 
} 

반환 호출자가 소유하지 않은 문자열을

및 메소드 이름이 ALLOC, 새, 또는 사본이 포함되어 있지 않습니다. 반환 값은 autoreleased이며, 따라서 호출자가 명시 적으로 유지하지 않으면 해당 autorelease 풀이 비울 때 할당 해제됩니다.

즉, 특정 시나리오에서 호출자가 소유하지 않은 개체를 반환하는 두 번째 전략은 더 나은 솔루션처럼 보입니다.호출자는 객체를 즉시 처리 (객체 소유에 관심이 없도록)하거나 속성 (일반적으로 복사 또는 보유 속성)에 보관합니다.

2

네, 당신의 권리. 함수에 메모리를 할당 한 경우이를 해제해야 할 책임도 있습니다. 이 상황에서 할당 된 객체를 반환하기 때문에이를 해제 할 수있는 유일한 방법은 자동 해제 풀에 배치하는 것입니다.

return [newObject autorelease]; 

(편집)

+0

@ Pete의 질문의 첫 번째 부분은 정확하게 잘못되었습니다. – kubi

+0

autorelease에 넣을 경우 어떤 문제가 생길지 설명해 주시겠습니까? 정말 문제가 보이지 않습니까? –

+0

사실 내 생각에, 피트는 그걸 올바르게 받아 들였습니다. 관례는 new, alloc 또는 copy로 시작하지 않는 모든 메소드는 자동으로 릴리즈 된 객체를 반환해야한다는 것입니다. 이 메서드를 호출 한 사람은이 메서드를 유지하려는 경우 해당 메서드를 유지해야합니다. –

0
  1. 당신은 Objective-C memory management guide을 읽어야합니다.
  2. new, alloc 또는 copy 방법에서 반환 된 모든 개체는 사용자의 것입니다. 소유하고 소유해야합니다.
  3. 다른 메소드에서 반환 된 객체는 모두 autorelease 풀에 있습니다. 현재 범위를 넘어서 객체를 유지하려면 객체를 유지해야합니다.

는 XML 예제 아마 올바른 : 당신이 방법에서 개체를 반환하고, 그 방법의 이름이, 관례 상, 오토 릴리즈 객체를 반환해야합니다 이름으로 new 또는 copy 포함되지 않은 경우.

+0

사실, 피트가 제대로 해냈다 고 생각합니다. 관례는 new, alloc 또는 copy로 시작하지 않는 모든 메소드는 자동으로 릴리즈 된 객체를 반환해야한다는 것입니다. 이 메서드를 호출 한 사람은이 메서드를 유지하려는 경우 해당 메서드를 유지해야합니다. –

+0

내 게시물을 잘못 읽은 것 같습니다. 나는 당신이 "할당하지 못했던 어떤 객체"에서 "not"를 놓쳤다 고 생각합니다. 하지만 내가 작성한 것을 이해하는 것처럼 내 메서드의 이름을 "구문 분석"이라고하면 반환하기 전에 autorelease를 호출해야합니다. "newUserFromXml"이라면 이름을 지어야합니까? – Pete

+0

링크가 멋지지만 아직 읽지는 못했지만 곧 나올 것입니다. – Pete

관련 문제