단일 사례 의 몇 가지 생 성 방식
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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.