단일 사례 의 몇 가지 생 성 방식

예 를 들 어 XYXmanager 라 고 가정 합 니 다.
GCD
. h 파일 중
+(instancetype)shareInstance;

. m 파일 중
+ (XYXManager *)defaultManager { 
    static XYXManager *defaultInstance = nil;
    static dispatch_once_t predicate;  
    dispatch_once(&predicate, ^{  
        defaultInstance = [[self alloc] init];   
    });  
    return defaultInstance;  
}

장점: 1. 이 방법 은 단일 예 를 만 들 거나 동작 을 초기 화 할 때 사용 하여 유일 성 을 확보 할 수 있 습 니 다.2. 이 방법 은 라인 이 안전 하기 때문에 안심 하고 과감하게 서브 라인 에서 사용 하 세 요.(전 제 는 dispatch once t * predicate 대상 이 전체 또는 정적 대상 이 어야 한 다 는 것 입 니 다. 이 점 이 중요 합 니 다. 이 점 을 보장 하지 못 하면 이 방법 이 한 번 만 실 행 될 것 이 라 고 보장 할 수 없습니다.)
2. @ synchronized
. h 파일 중
+(instancetype)shareInstance;

. m 파일 중
+ (XYXManager *)defaultManager { 
    static XYXManager *defaultInstance = nil;
    @synchronized (self){
        if (!defaultInstance){
            defaultInstance = [[super allocWithZone:NULL]init];
        }
    }
    return bluetoothInstance; 
}

@ synchronized 는 이 방법 에 자 물 쇠 를 추가 하 는 것 을 의미 합 니 다. 어떤 스 레 드 (예 를 들 어 스 레 드 A) 든 이 방법 을 실행 할 때 다른 스 레 드 가 있 는 지 확인 해 야 합 니 다. 예 를 들 어 B 가 이 방법 을 사용 하고 있 는 스 레 드 B 가 이 방법 을 실행 한 후에 이 스 레 드 A 를 실행 해 야 합 니 다. 없 으 면 직접 실행 합 니 다.장점: GCD 방법 보다 간단명료 하고 같은 라인 이 안전 하 며, alloc 초기 화, init 도 한 번 만 실행 할 수 있 습 니 다.
주의해 야 할 것 은 방법 하나 든 방법 둘 이 든 모두 다음 과 같은 아버지 방법 을 실현 해 야 한 다 는 것 이다.
+(instancetype)allocWithZone:(struct _NSZone *)zone{ return [self shareInstance]; }
-(id)copy{ return self; }
신기 한 팁 이에 요.
. m 파일 에 copy 와 allocWithZone 방법 을 쓰 지 않 으 려 면. h 에서 다른 사람 이 이 두 가지 방법 을 사용 하지 못 하도록 설정 할 수 있 습 니 다.
+(instancetype)alloc NS_UNAVAILABLE;
+(instancetype)allocWithZone:(struct _NSZone *)zone NS_UNAVAILABLE;
-(id)copy NS_UNAVAILABLE;

또 하나의 신기 한 팁.
데이터 초기 화가 필요 하 다 면init 중
.h   
-(instancetype)init NS_UNAVAILABLE;
.m 
@interface XYXManager()
-(instancetype)_init;
@end

+(instancetype)shareInstance{
    static EPLBluetooth *bluetoothInstance = nil;
    @synchronized (self){
        if (bluetoothInstance == nil){
            bluetoothInstance = [[super allocWithZone:NULL]_init];
        }
    }
    return bluetoothInstance;
}

-(instancetype)_init{
    if (self = [super init]) {
        //do the init things
    }
    return self;
}

마찬가지 로 init 방법 을 외부 에서 호출 하지 않 으 려 면 NS 를 사용 합 니 다.UNAVAILABLE h 파일 에 설정
자발적으로 release, retain, autorelease, retainCount 방법 을 추가 합 니 다.
- (id) retain
{
    return [XYXManager shareInstance];
}
- (oneway void) release
{

}
- (instancetype) autorelease
{
    return self;
}
- (unsigned) retainCount
{
    return UINT_MAX;
}

좋은 웹페이지 즐겨찾기