Mac OS X 용 Cocoa Programming의 처음 몇 장을 다시 읽었으며 저자는 NSCalendarDate
의 class 메소드 중 하나가 자동 복구 된 객체를 반환한다고 말합니다. 나는 항상 모든 클래스 메소드가 autoreleased 객체를 반환했다고 가정했다. (alloc
이 관련되어 있기 때문이다.)모든 클래스 메소드가 자동 렌더링 된 객체를 반환합니까?
구체적으로 보유해야하는 수업 방법이 있습니까?
감사합니다.
Mac OS X 용 Cocoa Programming의 처음 몇 장을 다시 읽었으며 저자는 NSCalendarDate
의 class 메소드 중 하나가 자동 복구 된 객체를 반환한다고 말합니다. 나는 항상 모든 클래스 메소드가 autoreleased 객체를 반환했다고 가정했다. (alloc
이 관련되어 있기 때문이다.)모든 클래스 메소드가 자동 렌더링 된 객체를 반환합니까?
구체적으로 보유해야하는 수업 방법이 있습니까?
감사합니다.
클래스 메서드는 인스턴스 메서드와 마찬가지로 표준 Cocoa memory management rules을 준수해야합니다.
당신은 이름이 는 "ALLOC"또는 "새로운"또는 시작 "복사"를 포함하는 방법을 사용하여 만들 경우 개체의 소유권을 (예를 들어, ALLOC, NewObject를, 또는 mutableCopy) 또는 에 보관 메시지를 보내면됩니다. 당신은 릴리스 또는 autorelease를 사용하여 소유하고있는 객체의 소유권을 소유하고 있습니다. 다른 시간에 개체를 수신하면 을 출시하지 않아야합니다.
아마도 자동 수신 된 객체 또는 싱글 톤 또는 이와 유사한 것에 대한 참조를 반환하고있을 것입니다. 어느 쪽이든 "alloc"또는 "new"로 시작하거나 "copy"가 포함되어 있지 않으면 객체를 해제 할 필요가 없습니다. 당신은 iVar 또는 이와 비슷한 것으로 저장하여 현재의 자동 풀 풀의 범위를 지키고 싶지 않다면 그것을 유지할 필요가 없다.
한 점을 명확히하기 : 싱글 톤의 경우 * 클래스 *는 유일한 인스턴스를 소유하므로 릴리스 또는 자동 릴리스하지 않습니다. 다른 모든 경우 (일반적으로 'stringWithUTF8String :'과 같은 편리한 팩토리 메소드)에서는 클래스가 인스턴스를 소유하지 않으므로 자동으로 풀어냅니다. –
Joey가 말한 것을 강화하기 위해서 - 당신이 신경 쓰는 유일한 것은 코코아 메모리 관리 규칙에 명시된 바와 같이 객체 소유입니다. 문제는 "내가 autorelease it라고 부른 메소드를"하지 않고 "반환 된 객체를 소유합니까?"입니다. –
+1 좋은 답변입니다. 약간의 추가 분석을 위해 내 대답을보십시오. –
일반적으로 메서드 이름에 alloc, new 또는 copy가 포함되어 있으면 해당 메서드의 소유주가됩니다. 그렇지 않으면 자동 출시되거나 다른 사람이 돌보고 있습니다. 즉, 소유하고 있지 않으므로 걱정할 필요가 없습니다.
편리한 방법은 일반적으로 자동 렌더링 된 객체를 반환합니다. 예 : [NSMutableArray 배열]은 [[[NSMutableArray alloc] init] autorelease]와 동일합니다.
이들이 클래스 메소드라는 사실 때문에 모든 클래스 메소드가 자동으로 릴리즈 된 객체를 반환한다는 결론을 이끌어 내지 말아야합니다. 그것은 명명 규칙에 관한 것입니다. menthod에 alloc *, 복사본, new * name이 있으면 반환 된 객체의 소유자가됩니다. 나는. 그것은 당신에게 전달되었을 때 최소한 1의 보유 수를 가질 것입니다.
그것은 전혀 객체를 반환하는이 클래스 메소드를하지 않는 기억 가치 - 어떤 방법 (등 구조체, 원시 형을 포함) 아무것도 또는 아무것도 (무효)를 반환 할 수 있습니다. Objective-C 언어에는 소유되지 않은 객체를 반환하는 클래스 메서드가 필요하지 않습니다. 즉 호출자가 release/autorelease 할 필요가 없음을 의미합니다.
그건 그렇고, @ 조이의 대답은 훌륭한 것입니다. 객체를 반환하는 클래스 메소드의 경험 법칙은 자동 릴리즈되어야한다는 것입니다. 클라이언트 코드에서 메모리 누수가 발생하지 않도록 규칙을 위반 한 부분을 명확히 문서화해야합니다.
기술적으로, 메소드가 자동 렌더링 된 객체를 반환하지 않으면 결과를 유지할 필요가 없습니다. 그것은 이미 유지되거나 코드가 버그가있어 반환 된 객체가 이미 할당 해제되었을 수 있습니다. – Chuck