문제

클래스 방법으로 전달 된 객체를 유지하고 공개하기위한 모범 사례는 무엇입니까?

예를 들어, "클래스 변수"가있는 경우 :

static NSString *_myString = nil

... 이것을하는 것이 옳은 일입니다.

+ (void)myClassMethod:(NSString *)param {
    _myString = param;
}

... 발신자가 조기에 방출 될 수없는 매개 변수에 대한 0이 아닌 유지를 유지 해야하는 단점이 있습니다. 또는이를 수행 할 수 있습니다.

+ (void)myClassMethod:(NSString *)param {
    [_myString autorelease];
    _myString = [param retain];
}

... 해당 클래스 수준없이 단점이 있습니다. dealloc 메모리 누출이라고 부릅니다. 아니면 이런 종류의 클래스 변수 치커리를 완전히 피해야 할 것입니다.

여기에 있습니다 싱글 톤 인스턴스 생성에 대한 Apple의 문서.

내가 작업하고있는 코드는 매우 매끄럽지 만 여전히 새로운 객관적인 리소스 프로젝트입니다.http://www.iphoneonrails.com/).

도움이 되었습니까?

해결책

절대적으로 유지하고 석방하십시오. 수업이 유일한 시간이기 때문에 누출이 아닙니다. dealloc 프로그램이 끝나는 시점은 어쨌든 메모리가 해제 될 때입니다. 첫 번째 방법으로는 더 번거롭고 코코아 메모리 관리 지침에 위배됩니다.

클래스 방법인지 또는 싱글 톤인지 여부에 관해서는 : 클래스 자체는 일반적으로 독립적 인 기능이 많지 않아야합니다. 클래스 변수가 부족하여 볼 수 있듯이 Objective-C에서 그런 식으로 설계되지 않았습니다. 클래스 방법은 일반적으로 인스턴스 생성 및 관리를 다루고 때로는 모든 인스턴스에 대한 공유 속성 또는 기본값을 저장해야합니다. 클래스의 실제 기능은 사례로 들어가야합니다. 이것이 바로 객관적인 C의 협약입니다.

(물론, 객관적인 신의 신은 없으며 당신은 컨벤션을 무시할 수 있지만 이것이 일반적인 지혜입니다.)

다른 팁

또한 NSString 또는 변형 된 변형이있는 클래스 (예 : NSArray 또는 NSDictionary), 매개 변수를 유지하는 대신 복사하는 것이 좋습니다. 문자열이 통과 한 경우 당신을 통과했습니다 NSMutableString, 그 가치는 나중에 바뀔 수 있으며, 수업에서도 바뀔 것입니다. 이것은 아마도 당신이 원하는 것이 아니므로 이것을 조언 할 것입니다.

+ (void)myClassMethod:(NSString *)param {
    [_myString release];
    _myString = [param copy];
}

그만큼 copy 메소드는 사본을 만들고 유지 카운트를 1로 설정하므로 변수를 유지하는 한 모두 설정되어 있습니다. 그리고 추가 보너스로, 발신자가 당신을 통과한다면 NSString, 그 클래스는 그 가치가 바뀔 수 없다는 것을 알기에 충분히 똑똑하기 때문에 단순히 객체의 사본을 만드는 것을 피하기 위해 스스로 유지됩니다. 얼마나 영리합니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top