zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    遗传算法中适值函数的标定与大变异算法
    遗传算法中几种不同选择算子及Python实现
    BZOJ_4025_二分图_线段树按时间分治+并查集
    BZOJ_1818_[Cqoi2010]内部白点 _扫描线+树状数组
    BZOJ_3165_[Heoi2013]Segment_线段树
    UOJ_21_【UR #1】缩进优化_数学
    UOJ_14_【UER #1】DZY Loves Graph_并查集
    BZOJ_5359_[Lydsy1805月赛]寻宝游戏_DP
    BZOJ_2813_奇妙的Fibonacci_线性筛
    51nod_1236_序列求和 V3 _组合数学
  • 原文地址:https://www.cnblogs.com/ming1025/p/6761053.html
Copyright © 2011-2022 走看看