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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python용 __new__방법은 단례적인 조작을 실현한다소개 init 방법은 보통 하나의 클래스를 초기화할 때 사용되지만, 사실은 하나의 클래스를 실례화할 때 첫 번째로 호출되는 방법이 아니다.Student (id,name) 와 같은 표현식을 사용하여 하나의 클래스를 실...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.