2011-01-13 5 views
0

나는 종종 다음과 비슷한 싱글 톤 클래스를 볼 수 있습니다.iPhone SDK : 정적 변수를 할당 할 때 nil을 검사해야합니까?

@implementation SomeImplementation 

static SomeClass *sharedSomeObject = nil; 

+ (void) someClassMethod { 
    sharedSomeObject = [[SomeImplementation alloc] init]; 
    // do something 
} 

@end 

someClassMethod는 언제든지 호출 할 수 있습니다. 먼저 sharedSomeObject의 새 인스턴스를 할당하기 전에 nil을 검사해야합니까? 또는 sharedSomeObject가 정적이기 때문에 검사가 필요하지 않습니까? 이런 식의 코드를 보면 항상 할당 주위에 if (! sharedSomeObject)를 넣고 싶습니다.

답변

3

예, 절대적으로! 그렇지 않으면 메서드가 호출 될 때마다 둘 이상의 객체를 만듭니다.

+ (SomeClass *) shared { 
    static SomeClass *sSingleton; 

    if (! sSingleton) sSingleton = [SomeClass new]; 

    return sSingleton; 
} 

편집

이 대답은 아주 오래된, 스레드 안전하지, 더 이상 적절한 싱글 초기화 방법 : 이것은 우리가 일을하는 방법입니다. 요즘 GCD로 일하는 올바른 방법은 this Stackoverflow answer을 참조하십시오.

+0

function-static 선언은 의도적 인 것입니다. 코드를 깨끗하게 유지하고 + 공유 메소드에 대한 가시성을 줄입니다. 이렇게하면 원하는 곳 어디에서나 "sSingleton"이라는 이름을 재사용 할 수 있습니다. 네임 스페이스 오염이 없습니다. – par

+0

또한 someClassMethod를 호출 할 때마다 sharedSomeObject의 이전 인스턴스가 누설 된 상태로 위의 코드가 누설되었다는 점을 지적 할 것입니다. 응! – par

+0

고마워요. 다행 이군. 그런 식으로 singleton을 구현한다면, 어떻게 그것을 공개합니까? 아마도 메모리를 절약하고 필요에 따라 다시 만들어야 할 경우가 있다고 생각합니다. – memmons

2

Objective-C에서 싱글 톤 디자인 패턴을 사용할 때는 Matt Galagher의 "SynthesizeSingleton.h"매크로를 사용하는 것이 좋습니다. 싱글 톤 (singleton)이 더 이상 필요하지 않을 경우 메모리를 자유롭게하는 것과 같은 모든 싱글 톤 관련 주제를 다룹니다.

http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html

당신에게 : 여기

이 주제에 대한 기사뿐만 아니라 "SynthesizeSingleton.h"헤더 파일의 다운로드 링크를 포함하는 "코코아 사랑"의 웹 사이트에 대한 링크입니다 또한 전역 변수를 사용하는 것과 단일성 디자인 패턴을 사용하는 것에 대한 토론과 거기에 싱글 톤을 사용하는 다른 접근법에 대한 몇 가지 고려 사항을 찾을 수 있습니다.

+1

그레이트 포스트. 이것을 사용하기 시작할 것입니다. Matt의 코드는 스레드로부터 안전하다는 점과 싱글 톤을 해제하지 않는 것이 좋습니다. 내가 바꿀 유일한 것은 클래스 이름의 연결입니다 (너무 많은 타이핑). + (SomeClass *) 공유; 깨끗해 보인다. – par

관련 문제