1. 程式人生 > >iOS防止單例物件被重複建立

iOS防止單例物件被重複建立

#import "Person.h"

static Person *_instance;

@implementation Person

/** Person單例 */
+ (instancetype)sharedPerson
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [[Person alloc] init];
    });
    
    return _instance;
}

/** 重寫單例物件的alloc方法, 防止單例物件被重複建立 */
+ (instancetype)alloc
{
    if (_instance) {
        // 如果單例物件存在則丟擲異常
        NSException *exception = [NSException exceptionWithName:@"重複建立單例物件異常" reason:@"請使用Person的單例方法." userInfo:nil];
        [exception raise];
        
    }
    return [super alloc]; // 如果單例物件不存在則正常建立Person
}

當Person物件被重複alloc建立的時候就會丟擲異常:

    Person *p1 = [Person sharedPerson];
    Person *p2 = [[Person alloc] init]; // 重複建立


異常丟擲:

*** Terminating app due to uncaught exception '重複建立單例物件異常', reason: '請使用Person的單例方法.'