objective-c - 如何避免通过[[alloc] init]创建iOS单例类
大家讲道理
大家讲道理 2017-04-18 09:41:01
0
6
732

网站普遍的创建单例类的方法有下面两种:

+ (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的情况

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

모든 응답(6)
Ty80

http://www.jianshu.com/p/08b1...
제 블로그 게시물을 확인해 보세요.

黄舟

메서드를 찾기 위해 다시 stackovweflow에 갔습니다. 싱글톤 모드이기 때문에 호출자는 싱글톤의 요구 사항을 엄격히 준수하고 통합 인터페이스(여기서는 sharedInstance)를 통해 싱글톤을 생성해야 한다고 생각합니다. no call [ [class alloc] init]도 성공적으로 싱글톤을 생성할 수 있습니다. [[class alloc] init]이 발생하면 Xcode에서 이 메서드를 사용할 수 없다는 경고를 표시해야 한다고 생각합니다

으아악
PHPzhong

추가 생성이 많이 있으며, 이러한 측면을 오버로드하여 sharedManager 인스턴스를 반환하거나 직접 예외를 발생시키는 새로운 메서드도 있습니다.

迷茫

allocWithZone 및 copyWithZone 메소드를 재정의합니다.
alloc, copy, new 등을 통해 allocWithzone, copyWithzone을 호출하여 공간을 할당하기 때문입니다.
sharedManager 메소드의 코드를 이 두 메소드에 작성하여 처음부터 싱글톤 상황을 달성할 수 있습니다

大家讲道理
  • (instancetype)init {
    @throw [NSException 예외WithName:@"Disable" 이유:@"대신 init를 사용하십시오..." userInfo:nil];
    return self;
    }

Peter_Zhu

그냥 이렇게 써보세요

으아악
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿