B1 - 단일 실행(단일 매크로)

9603 단어 단례
무엇
하나의 예는, 하나의 클래스이며, 매번 만들 때마다 같은 대상이다.한 번만 실례화할 수 있다는 얘기다.
2. 매번 창설할 때마다 같은 대상이 되는 것을 어떻게 보장합니까
대상을 만드는 것은 결국 하나의 경로를 거친다. alloc 방법 (alloc 방법은 allocWithZone:).따라서 alloc 방법은 한 번만 호출되고 라인의 안전을 보증한 다음에 이 대상을 정적 구역에 두십시오.나중에 개체를 만들든 copy 개체를 만들든 정적 영역의 개체로 돌아갑니다.
주의점
정적 전역 변수는 방출 문제(MRC에 적용)를 고려할 필요가 없고 라인 안전 문제를 해결하려면 상호 배척 자물쇠나 GCD를 사용하는 것이 좋다.
객체가 다시 초기화되지 않도록 설정할 수도 있습니다. 즉, 초기화 방법은 한 번만 수행할 수 있습니다.
4. 구체적인 실현 코드는 다음과 같다.
@implementation myManager

static id instance;



+ (instancetype)allocWithZone:(struct _NSZone *)zone

{

    // 1、 

//        @synchronized (self) {

//            if (instance == nil)

//            {

//                instance = [super allocWithZone:zone];

//            }

//        }

    

    // 2、GCD, 

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        if (instance == nil)

        {

            instance = [super allocWithZone:zone];

        }

    });

    return instance;

}



+ (instancetype)sharedSoundTools

{

    instance = [[self alloc] init];

    return instance;

}



- (id)copyWithZone:(NSZone *)zone

{

    return instance;

}



#pragma mark - MRC  

- (oneway void)release

{

    //  

}



- (instancetype)retain

{

    //

    return instance;

}



- (instancetype)autorelease

{

    return instance;

}



- (NSUInteger)retainCount

{

    //  , while 

    return ULONG_MAX;

}



- (instancetype)init

{

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        

        self = [super init];

        if (self)

        {

            self.age = 10; //  , , 

        }

    });

    return self;

}



@end

 
단례홍
다음 코드는 단독singleton에 쓰여 있습니다.h 파일에 사용 시 직접 포함됩니다.h 헤더 파일.
사용 방법.h 파일: singletonInterface(myManager),
                    .m 파일: singletonImplementation(myManager),
추출 코드는 다음과 같습니다.
#define singletonInterface(className)          + (instancetype)shared##className;



#if __has_feature(objc_arc)

//  ARC 

#define singletonImplementation(className) \

+ (instancetype)allocWithZone:(struct _NSZone *)zone { \

    static dispatch_once_t onceToken; \

    dispatch_once(&onceToken, ^{ \

        if (instance == nil) { \

            instance = [super allocWithZone:zone]; \

        } \

    }); \

    return instance; \

} \

+ (instancetype)shared##className { \

    static dispatch_once_t onceToken; \

    dispatch_once(&onceToken, ^{ \

        instance = [[self alloc] init]; \

    }); \

    return instance; \

} \

- (id)copyWithZone:(NSZone *)zone { \

    return instance; \

}

#else

//  MRC 

#define singletonImplementation(className) \

+ (instancetype)allocWithZone:(struct _NSZone *)zone { \

    static dispatch_once_t onceToken; \

    dispatch_once(&onceToken, ^{ \

        if (instance == nil) { \

            instance = [super allocWithZone:zone]; \

        } \

    }); \

    return instance; \

} \

+ (instancetype)shared##className { \

    static dispatch_once_t onceToken; \

        dispatch_once(&onceToken, ^{ \

        instance = [[self alloc] init]; \

    }); \

    return instance; \

} \

- (id)copyWithZone:(NSZone *)zone { \

    return instance; \

} \

- (oneway void)release {} \

- (instancetype)retain {return instance;} \

- (instancetype)autorelease {return instance;} \

- (NSUInteger)retainCount {return ULONG_MAX;}

#endif



//   \

 
6. 단례적인 두 가지 모드 1. 게으름뱅이는 필요할 때 메모리에 불러온다.2. 아사자식은 가장 빠른 시간에 일례를 만들어 메모리에 넣고 언제든지 사용할 수 있다.
//  

@implementation HMSoundTools

static id instance;



//

+ (void)load {

    instance = [[self alloc] init];

}



////+ (void)initialize {

//    

//}



+ (instancetype)sharedSoundTools {

    return instance;

}



- (id)copyWithZone:(NSZone *)zone {

    return instance;

}

 
 

좋은 웹페이지 즐겨찾기