网站普遍的创建单例类的方法有下面两种:
+ (instancetype)sharedManager {
static id _sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedInstance = [[self alloc] init];
});
return _sharedInstance;
}
+ (instancetype)sharedManager {
static id _sharedInstance = nil;
@synchronized(self) {
if (_sharedInstance == nil)
_sharedInstance = [[self alloc] init];
}
return _sharedInstance;
}
但是该如何避免意外的用[[alloc] init]
创建呢?主要是发现网上找到的大多仅仅只有上面的代码,少有考虑被init
或者copy
的情况
http://www.jianshu.com/p/08b1...
제 블로그 게시물을 확인해 보세요.
메서드를 찾기 위해 다시 stackovweflow에 갔습니다. 싱글톤 모드이기 때문에 호출자는 싱글톤의 요구 사항을 엄격히 준수하고 통합 인터페이스(여기서는 sharedInstance)를 통해 싱글톤을 생성해야 한다고 생각합니다. no call [ [class alloc] init]도 성공적으로 싱글톤을 생성할 수 있습니다. [[class alloc] init]이 발생하면 Xcode에서 이 메서드를 사용할 수 없다는 경고를 표시해야 한다고 생각합니다
으아악추가 생성이 많이 있으며, 이러한 측면을 오버로드하여 sharedManager 인스턴스를 반환하거나 직접 예외를 발생시키는 새로운 메서드도 있습니다.
allocWithZone 및 copyWithZone 메소드를 재정의합니다.
alloc, copy, new 등을 통해 allocWithzone, copyWithzone을 호출하여 공간을 할당하기 때문입니다.
sharedManager 메소드의 코드를 이 두 메소드에 작성하여 처음부터 싱글톤 상황을 달성할 수 있습니다
(instancetype)init {
@throw [NSException 예외WithName:@"Disable" 이유:@"대신 init를 사용하십시오..." userInfo:nil];
return self;
}
그냥 이렇게 써보세요
으아악