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;
}
时间: 2024-08-01 12:17:04

iOS大神班笔记02-模仿苹果创建单例的相关文章

iOS大神班笔记03-UIApplication

UIApplication简介: UIApplication对象是应用程序的象征. 每一个应用程序都有自己的UIApplication对象,而且是单例. 一个iOS程序启动后创建的第一个对象就是UIApplication对象. 通过UIApplication *app = [UIApplication sharedApplication];可以获得这个单例对象. 利用UIApplication对象能进行一些应用级别的操作. 利用UIApplication对象能进行一些应用级别的操作. 设置应用程

iOS 模仿苹果编写单例

#import <Foundation/Foundation.h> @interface Person : NSObject +(instancetype)sharePerson; @end #import "Person.h" @implementation Person static Person *_instance = nil; +(void)load{ _instance = [[self alloc] init];// 已进入就调用 } +(instancety

模仿UIApplication创建单例

原文地址:https://www.cnblogs.com/lyz0925/p/11478468.html

小码哥Java大神班五期 任小龙SSM Spring5 Mybatis SpringMVC

详情请交流  QQ  709639943 00.小码哥Java大神班五期 任小龙SSM Spring5 Mybatis SpringMVC 00.Python玩转人工智能框架 TensorFlow 00.web开发级mysql颠覆实战课程 00.微信小游戏入门与实战 刷爆朋友圈 00.四大维度解锁 Webpack 3.0 前端工程化 00.前端成长必经之路-组件化思维与技巧 京东金融 01.从天气项目看Spring Cloud微服务治理 02.Java项目实战--报表开发(JasperRepor

IOS 使用dispatch_once 创建单例

+ (instantClass *)sharedClient { static instantClass *_sharedClient = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _sharedClient = [[instantClass alloc] init]; }); return _sharedClient; } IOS 使用dispatch_once 创建单例,码迷,mamicode.co

ios学习记录 day44 UI20 Storyboard 高级可视化编程 + 单例

可视化编程 : 5.0之前 xib  5.0之后 Storyboard 注意事项:1.在AppDelegate中不用代码初始化一个window   2.在general  设置 Main Interface(创建的时候自动设置的) weak可以指向 但是没有拥有权   strong有拥有权 单例特性: 1.唯一性  创建的对象永远指向同一块内存地址     2.不释放   从打开程序到后台关闭 对象都不释放 单例安全:加锁@synchronized  防止同一块内存被创建两次,破坏唯一性 //单

iOS中创建单例的两种方式

刚刚开始做iOS开发的时候,不知道怎么创建单例,在网上搜的也大多数都不太全,所以总结了一下创建单例的两种方式 首先在.h文件中声明类方法 1 +(instancetype)sharedUtils; 然后在.m文件中实现它,实现的方法有两种 第一种,在创建一个对象时先判断在程序中有没有创建过这个对象 1 static PublicUtils *DefaultManager = nil; 2 3 +(instancetype)sharedUtils 4 { 5 if (!DefaultManager

IOS基础学习日志(七)利用dispatch_once创建单例及使用

自苹果引入了Grand Central Dispatch (GCD)(Mac OS 10.6和iOS4.0)后,创建单例又有了新的方法,那就是使用dispatch_once函数,当然,随着演进的进行,还会有更多的更好的方法出现.今天就来简要介绍下如何利用dispatch_once创建单例. 在开发中我们会用到NSNotificationCenter.NSFileManager等,获取他们的实例通过[NSNotificationCenter defaultCenter]和[NSFileManage

笔记:Java中的单例设计模式

之前接触过单例模式,当初不明白这样的设计用意,今天特地研究了下java中的单例设计模式的用处及用法. 单例模式:单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.一个类有且仅有一个实例,并且自行实例化向整个系统提供. 单例模式的用处:一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务:一个系统只能有一个窗口管理器或文件系统:一个系统只能有一个计时工具或ID(序号)生成器.如在Windows中就只能打开一个任务管理器.如果不使用机制对窗口对象进行唯一化,将