Objective - C 디자인 모드 - 단일 싱글 톤 (대상 생 성)

5421 단어 Objective-C
일례
다른 언어 와 의 단일 사례 가 많 지 않 아 가장 간단 한 디자인 모델 이 라 고 할 수 있다.그러나 몇 가지 주의해 야 할 점 이 있 습 니 다. 한 가지 예 는 하나의 사례 만 있 습 니 다.
그래서 우 리 는 이런 종류의 다른 실례 가 발생 하 는 것 을 막 을 방법 을 강구 해 야 한다. 일반 언어 에 서 는 구조 함 수 를 private 라 고 쓴다.그러나 OC 의 함 수 는 한정 문자 가 없 기 때문에 우 리 는 작은 기술 로 이 점 을 차단 해 야 한다.
 
응용 장면
클래스 는 하나의 사례 만 있 을 수 있 고 사람들 에 게 잘 알려 진 방문 점 에서 이 를 방문 해 야 한다. 예 를 들 어 공장 방법 이다.
이 유일한 인 스 턴 스 는 클래스 의 하위 클래스 를 통 해 만 확장 할 수 있 고 확장 대상 은 클 라 이언 트 코드 를 파괴 하지 않 습 니 다.
 
주의 하 다.
1. OC 에서 하나의 인 스 턴 스 변 수 는. m 파일 로 정의 해 야 합 니 다.
2. OC 에서 하나의 예 는 allocWithZone: copy WithZone: 방법 으로 다른 인 스 턴 스 를 만 드 는 것 을 방지 해 야 합 니 다.
3. 단일 사례 생 성 은 스 레 드 안전 에 주의해 야 합 니 다. 그렇지 않 으 면 여러 개의 인 스 턴 스 가 발생 할 수 있 습 니 다.
주의 문 제 는 데모 에서 설명 하 겠 습 니 다.
 
Demo
먼저 가장 일반적인 엄밀 하지 않 은 단일 사례 의 실현 을 살 펴 보 자.
@implementation Singleton

static Singleton *sharedInstance;

-(Singleton *)sharedInstance
{
    if(sharedInstance)
    {
        sharedInstance = [Singleton new];
    }
    return sharedInstance;
}

@end

이것 은 마치 하나의 대상 을 얻 을 수 있 을 것 같 지만, 이것 은 하나의 변형 이 라 고 할 수 있다.이것 이 하나의 예 라 고 말 해 서 는 안 된다. 왜냐하면 우 리 는 쉽게 다른 방식 으로 대상 을 만 들 수 있 기 때문이다.
그래서 저 희 는 allocWithZone: copy WithZone: 방법 (alloc 와 copy 방법 은 실제로 이 두 가지 방법 을 호출 하 는 것 입 니 다) 을 수정 해 야 합 니 다.
-(id)copyWithZone:(NSZone *)zone
{
    return [[self class] sharedInstance];
}

+(id)allocWithZone:(struct _NSZone *)zone
{
    return [self sharedInstance];
}

그러나 이것 은 또 다른 문제 가 발생 했 습 니 다. shared Instance 방법 에서 우 리 는 allocWithZone: (new 호출 alloc) 을 실제 호출 한 적 이 있 습 니 다. 그러나 그것 의 alloc 는 우리 가 다시 썼 습 니 다. 이것 은 오류 가 발생 할 수 있 습 니 다.그래서 저희 가 shared Instance 방법 을 수정 해 야 돼 요.
+(Singleton *)sharedInstance
{
    if(sharedInstance)
    {
        sharedInstance = [[super allocWithZone:NULL] init];
    }
    return sharedInstance;
}

이렇게 하면 하나의 예 를 순조롭게 되 돌 릴 수 있 고 다른 방식 으로 인 스 턴 스 대상 을 만 들 수 없다.
완벽 해 보이 지만 실제 적 으로 문제 가 발생 할 수 있 습 니 다. 지금 은 비 스 레 드 가 안전 하고 같은 시간 에 여러 개의 인 스 턴 스 를 만 드 는 상황 이 존재 할 수 있 기 때문에 다음 과 같이 수정 합 니 다.
+(instancetype)sharedInstance
{
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        sharedInstance = [[super allocWithZone:NULL] init];
    });
    return sharedInstance;
}

클 라 이언 트 코드 는 다음 과 같 습 니 다.
        Singleton *singleton = [Singleton sharedInstance];
        Singleton *singleton2 = [[Singleton alloc] init];
        Singleton *singleton3 = [singleton copy];
 
        [singleton print];
        [singleton2 print];
        [singleton3 print];

출력 결과:
2015-07-21 21:10:32.797 Singleton[42537:10347987] 0x7fff5fbff7a8
2015-07-21 21:10:32.798 Singleton[42537:10347987] 0x7fff5fbff7a8
2015-07-21 21:10:32.798 Singleton[42537:10347987] 0x7fff5fbff7a8

메모리 가 같은 주 소 를 가리 키 는 것 을 볼 수 있다.

좋은 웹페이지 즐겨찾기