码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2017-04-25 13:27:15      阅读:302      评论:0      收藏:0      [点我收藏+]

标签:大神   func   模拟   告诉   创建   isp   异常类   重写   name   

首先我们得要知道苹果是如何实现单例的: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;
}

 

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

标签:大神   func   模拟   告诉   创建   isp   异常类   重写   name   

原文地址:http://www.cnblogs.com/ming1025/p/6761053.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!