2009-09-04 5 views
3

Mac OS X 용 Cocoa Programming의 처음 몇 장을 다시 읽었으며 저자는 NSCalendarDate의 class 메소드 중 하나가 자동 복구 된 객체를 반환한다고 말합니다. 나는 항상 모든 클래스 메소드가 autoreleased 객체를 반환했다고 가정했다. (alloc이 관련되어 있기 때문이다.)모든 클래스 메소드가 자동 렌더링 된 객체를 반환합니까?

구체적으로 보유해야하는 수업 방법이 있습니까?

감사합니다.

+1

기술적으로, 메소드가 자동 렌더링 된 객체를 반환하지 않으면 결과를 유지할 필요가 없습니다. 그것은 이미 유지되거나 코드가 버그가있어 반환 된 객체가 이미 할당 해제되었을 수 있습니다. – Chuck

답변

22

클래스 메서드는 인스턴스 메서드와 마찬가지로 표준 Cocoa memory management rules을 준수해야합니다.

당신은 이름이 는 "ALLOC"또는 "새로운"또는 시작 "복사"를 포함하는 방법을 사용하여 만들 경우 개체의 소유권을 (예를 들어, ALLOC, NewObject를, 또는 mutableCopy) 또는 에 보관 메시지를 보내면됩니다. 당신은 릴리스 또는 autorelease를 사용하여 소유하고있는 객체의 소유권을 소유하고 있습니다. 다른 시간에 개체를 수신하면 을 출시하지 않아야합니다.

아마도 자동 수신 된 객체 또는 싱글 톤 또는 이와 유사한 것에 대한 참조를 반환하고있을 것입니다. 어느 쪽이든 "alloc"또는 "new"로 시작하거나 "copy"가 포함되어 있지 않으면 객체를 해제 할 필요가 없습니다. 당신은 iVar 또는 이와 비슷한 것으로 저장하여 현재의 자동 풀 풀의 범위를 지키고 싶지 않다면 그것을 유지할 필요가 없다.

+3

한 점을 명확히하기 : 싱글 톤의 경우 * 클래스 *는 유일한 인스턴스를 소유하므로 릴리스 또는 자동 릴리스하지 않습니다. 다른 모든 경우 (일반적으로 'stringWithUTF8String :'과 같은 편리한 팩토리 메소드)에서는 클래스가 인스턴스를 소유하지 않으므로 자동으로 풀어냅니다. –

+1

Joey가 말한 것을 강화하기 위해서 - 당신이 신경 쓰는 유일한 것은 코코아 메모리 관리 규칙에 명시된 바와 같이 객체 소유입니다. 문제는 "내가 autorelease it라고 부른 메소드를"하지 않고 "반환 된 객체를 소유합니까?"입니다. –

+0

+1 좋은 답변입니다. 약간의 추가 분석을 위해 내 대답을보십시오. –

0

일반적으로 메서드 이름에 alloc, new 또는 copy가 포함되어 있으면 해당 메서드의 소유주가됩니다. 그렇지 않으면 자동 출시되거나 다른 사람이 돌보고 있습니다. 즉, 소유하고 있지 않으므로 걱정할 필요가 없습니다.

1

편리한 방법은 일반적으로 자동 렌더링 된 객체를 반환합니다. 예 : [NSMutableArray 배열]은 [[[NSMutableArray alloc] init] autorelease]와 동일합니다.

이들이 클래스 메소드라는 사실 때문에 모든 클래스 메소드가 자동으로 릴리즈 된 객체를 반환한다는 결론을 이끌어 내지 말아야합니다. 그것은 명명 규칙에 관한 것입니다. menthod에 alloc *, 복사본, new * name이 있으면 반환 된 객체의 소유자가됩니다. 나는. 그것은 당신에게 전달되었을 때 최소한 1의 보유 수를 가질 것입니다.

1

그것은 전혀 객체를 반환하는이 클래스 메소드를하지 않는 기억 가치 - 어떤 방법 (등 구조체, 원시 형을 포함) 아무것도 또는 아무것도 (무효)를 반환 할 수 있습니다. Objective-C 언어에는 소유되지 않은 객체를 반환하는 클래스 메서드가 필요하지 않습니다. 즉 호출자가 release/autorelease 할 필요가 없음을 의미합니다.

그건 그렇고, @ 조이의 대답은 훌륭한 것입니다. 객체를 반환하는 클래스 메소드의 경험 법칙은 자동 릴리즈되어야한다는 것입니다. 클라이언트 코드에서 메모리 누수가 발생하지 않도록 규칙을 위반 한 부분을 명확히 문서화해야합니다.

관련 문제