iOS大神班笔记02-模仿苹果创建单例

首先我们得要知道苹果是如何实现单例的:1.不能外界调用alloc,一调用就崩掉,其实就是抛异常(类内部第一次调用alloc就不崩溃,其他都崩溃)。

                   2.提供一个方法给外界获取单例。

                       3.内部创建一次单例,什么时候创建,程序启动的时候创建单例。

然后我们来创建一个Person类。

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject

// 获取单例
+ (instancetype)sharePerson;

@end
Person.m

#import "Person.h"

@implementation Person
// 程序启动时候创建对象

// 静态变量
static Person *_instance = nil;

// 作用:加载类
// 什么调用:每次程序一启动,就会把所有的类加载进内存
+ (void)load
{
    NSLog(@"%s",__func__);
    
   _instance = [[self alloc] init];
    
}

+ (instancetype)sharePerson
{
    return _instance;
}

+ (instancetype)alloc
{
    
    if (_instance) {
        // 标示已经分配好了,就不允许外界在分配内存
        
        // 抛异常,告诉外界不运用分配
        // 'NSInternalInconsistencyException', reason: 'There can only be one UIApplication instance.'

        // 创建异常类
        // name:异常的名称
        // reson:异常的原因
        // userInfo:异常的信息
        NSException *excp = [NSException exceptionWithName:@"NSInternalInconsistencyException" reason:@"There can only be one Person instance." userInfo:nil];
        
        // 抛异常
        [excp raise];
        
    }
    
    // super -> NSObject 才知道怎么分配内存
    // 调用系统默认的做法, 当重写一个方法的时候,如果不想要覆盖原来的实现,就调用super
    return [super alloc];
}

  在这里我只是想模拟下苹果底层是如何实现单例的,我们一般情况下并不会使用这种方法。我们一般会使用如下方法:

+(instancetype)sharedPerson
{
    // 静态变量
    static Person *_instance = nil;
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [[self alloc]init];
    });
    return _instance;
}

 

posted on 2017-04-25 11:16  ming1025  阅读(212)  评论(0编辑  收藏  举报