首先我们得要知道苹果是如何实现单例的: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-模仿苹果创建单例的更多相关文章

  1. iOS大神班笔记03-UIApplication

    UIApplication简介: UIApplication对象是应用程序的象征. 每一个应用程序都有自己的UIApplication对象,而且是单例. 一个iOS程序启动后创建的第一个对象就是UIA ...

  2. iOS大神班笔记04-View的加载

    iOS开发中一个控制器创建View的过程(注意标注的地方): 1.通过storyboard加载 UIStoryboard的三个方法: + (UIStoryboard *)storyboardWithN ...

  3. iOS大神班笔记01-项目中常见的文件

    1.Info.plist文件:项目配置文件 主要作用:保存应用的信息,软件名称等等,相当于身份 证.程序加载首先加载配置文件,读取软件名称等信息. Bundle display name:项目名称 B ...

  4. 模仿UIApplication创建单例

    UIApplicationMain: 1.创建UIApplication--应用程序唯一标识:可设置状态栏.识别联网状态.设置数字.打电话.发邮件.发短信.打开网页 2.创建UIApplication ...

  5. IOS:利用dispatch_once创建单例

    在之前有一篇学习笔记中,记载了一篇如何在OC中实现单例的文章:<IOS学习笔记4—Objective C—创建单例>自苹果引入了Grand Central Dispatch (GCD)(M ...

  6. iOS 创建单例的两种方法

    创建一个单例很多办法.我先列举一个苹果官方文档中的写法. [cpp] view plaincopy static AccountManager *DefaultManager = nil; + (Ac ...

  7. 【iOS开发】创建单例的两种方法

    创建一个单例很多办法.我先列举一个苹果官方文档中的写法. [cpp] view plaincopy   static AccountManager *DefaultManager = nil; + ( ...

  8. [iOS dispatch_once创建单例]

    自苹果引入了Grand Central Dispatch (GCD)(Mac OS 10.6和iOS4.0)后,创建单例又有了新的方法,那就是使用dispatch_once函数,当然,随着演进的进行, ...

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

    自苹果引入了Grand Central Dispatch (GCD)(Mac OS 10.6和iOS4.0)后,创建单例又有了新的方法,那就是使用dispatch_once函数,当然,随着演进的进行. ...

随机推荐

  1. BZOJ3671: [Noi2014]随机数生成器(贪心)

    Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 2098  Solved: 946[Submit][Status][Discuss] Descripti ...

  2. 浅谈MySQL字符集

      Preface       MySQL use character set & collation to organize the different charater.It provid ...

  3. 前端之HTML和CSS

    html概述及html文档基本结构 html概述 HTML是 HyperText Mark-up Language 的首字母简写,意思是超文本标记语言,超文本指的是超链接,标记指的是标签,是一种用来制 ...

  4. mysql 1055 的错误

    1.Err1055,出现这个问题往往是在执行sql语句时候,在最后一行会出现这个问题. [Err] 1055 - Expression #1 of ORDER BY clause is not in ...

  5. 正则表达式re.S的用法

    正则表达式re.S的用法 在Python的正则表达式中,有一个参数为re.S.它表示"."(不包含外侧双引号,下同)的作用扩展到整个字符串,包括"\n".看如下 ...

  6. 华为ensp工具栏丢失解决方法

    电脑是win8系统 不知道什么原因,华为模拟器的工具栏神奇的消失了,感觉很郁闷,每次要写字的时候都找不到在哪里(菜单里也没有),于是在官方论坛里面找了一下终于找出原因了. 关闭ensp,点击属性,进入 ...

  7. 財務会計管理(FI&CO)

    FI(財務会計)系のSAP DBテーブル.随時更新していきます. [勘定コードマスタ]SKA1: 勘定コードマスタ(勘定コード表データ)SKB1: 勘定コードマスタ(会社コードデータ)SKAT: テキ ...

  8. Eclipse EE 运行 Myeclipse Web 应用

    第一步:进入项目所在目录,打开.project文件,找到<natures>...</natures>标签,在中间添加如下子标签内容 <nature>org.ecli ...

  9. Android onConfigurationChanged 收不到回调

    我返现,90度横屏 旋转到270度横屏onConfigurationChanged 是收不到回掉的.尽管清单里面声明了什么: android:configChanges="orientati ...

  10. Java继承的缺点

    转载自:https://www.cnblogs.com/xz816111/archive/2018/05/24/9080173.html JAVA中使用到继承就会有两个无法回避的缺点: 1.打破了封装 ...