//  Tools.h

#import <Foundation/Foundation.h>

@interface Tools : NSObject<NSCopying, NSMutableCopying>
// 一般情况下创建一个单例对象都有一个与之对应的类方法,一般情况下用于创建单例对象的方法名称都以share开头, 或者以default开头
+ (instancetype)shareInstance; @end
//
// Tools.m #import "Tools.h" @implementation Tools + (instancetype)shareInstance
{
Tools *instance = [[self alloc] init];//调用allocWithZone
return instance;
} static Tools *_instance = nil;
+ (instancetype)allocWithZone:(struct _NSZone *)zone //alloc内部会调用allocWithZone
{
// 由于所有的创建方法都会调用该方法, 所以只需要在该方法中控制当前对象只创建一次即可 /*
// 当前代码在多线程中可能会出现问题
NSLog(@"%s", __func__);
if (_instance == nil) {
NSLog(@"创建了一个对象");
_instance = [[super allocWithZone:zone] init]; //去父类创建,不能用self否则会死循环,
}
return _instance;
*/ // 以下代码在多线程中也能保证只执行一次
static dispatch_once_t onceToken;//long类型
dispatch_once(&onceToken, ^{
_instance = [[super allocWithZone:zone] init];
});
return _instance;
} // copyWithZone方法用什么调用? 对象,对象已经有了,就用原来的对象。
- (id)copyWithZone:(NSZone *)zone{
// Tools *t = [[[self class] allocWithZone:zone] init]; //调用allocWithZone,所以这里也是单利,
// return t;
return _instance;
} - (id)mutableCopyWithZone:(NSZone *)zone
{
// Tools *t = [[[self class] allocWithZone:zone] init];
// return t; return _instance;
} //MRC:MRC才可以写release,retain,retainCount
- (oneway void)release
{
// 为保证整个程序过程中只有一份实例, 在这个方法中什么都不做,单利释放了就没有了。
} - (instancetype)retain
{
return _instance;
} - (NSUInteger)retainCount
{
// return 1;
// 注意: 为了方便程序员之前沟通, 一般情况下不会在单例中返回retainCount = 1
// 而是返回一个比较大得值
return MAXFLOAT;
} @end
//
// main.m
// 单例:只有一个实例,只有程序挂掉实例才释放。
// #import <Foundation/Foundation.h>
#import "Tools.h" int main(int argc, const char * argv[]) { //ARC
// 单例就是无论怎么创建都只能有一个实例对象
// 如果地址相同就代表着是同一个实例对象
Tools *t11 = [[Tools alloc] init]; //alloc内部会调用allocWithZone,这里调用allocWithZone,
Tools *t21 = [Tools new];// [[alloc] init], allocWithZone,,这里调用allocWithZone,
Tools *t31 = [Tools shareInstance];//先调用shareInstance再调用allocWithZone, Tools *t41 = [t31 copy];
Tools *t51 = [t31 mutableCopy]; NSLog(@"%p, %p, %p, %p, %p", t11, t21, t31, t41, t51);//0x1005035e0, 0x1005035e0, 0x1005035e0, 0x1005035e0, 0x1005035e0 //MRC
Tools *t2 = [[Tools alloc] init];
[t2 retain];
[t2 retain];
[t2 retain];
[t2 retain];
[t2 retain];
NSLog(@"retainCount = %lu", [t2 retainCount]);//
NSLog(@"t2 = %p", t2);//t2 = 0x1005035e0
[t2 release]; Tools *t1 = [Tools shareInstance];
NSLog(@"retainCount = %lu", [t1 retainCount]);//
NSLog(@"t1 = %p", t1);//0x1005035e0
[t1 release]; return ;
}

oc84--单利的更多相关文章

  1. java 开发中经常问到得懒汉模式 (单利模式)

    //懒汉模式 class Single { public static Single s = null; public Single (){} public static Single getInst ...

  2. Javase部分回顾(static (静态修饰符),修饰方法,单利的设计模式, 封装)

    static (静态修饰符)        1.修饰成员变量        静态变量的访问方式:            方式一 : 通过对象访问.                对象.变量名      ...

  3. java 单利模式

    首先何为单利模式: 单利模式即多次调用同一个对象的时候,只有一个实例(这里所谓的实例就是,假如创建了两个对象,它们的hashCode相同) 下面是相关代码: 1 创建一个对象Singleton类 pa ...

  4. static单利模式

    // //  main.m //  01-文件管理器 // //  Created by apple on 14-3-21. //  Copyright (c) 2014年 apple. All ri ...

  5. 单利 复利计算器程序1.0 2.0 3.0 [ 合 ] 之 C语言

    本程序用C语言编写~~~ 1.计算:本金为100万,利率或者投资回报率为3%,投资年限为30年,那么,30年后所获得的利息收入:按复利计算公式来计算就是:1,000,000×(1+3%)^30 1 v ...

  6. java 设计模式之单利模式以及代理模式(静态)

    1:单利模式: public class Singleton { private static Singleton uniqueInstance = null; private Singleton() ...

  7. PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

      前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象 ...

  8. iOS 单利模式实现/优缺点

    感谢此文章提供摘要: http://www.cnblogs.com/lyanet/archive/2013/01/11/2856468.html 优缺点:http://blog.csdn.net/ta ...

  9. Node.js之单利模式

    在iOS中我们经常用到单利模式,这样就能够实现在多处共享同一数据,那么在Node.js中也存在这种模式. 我们知道,Node.js中模块的概念很重要,在写模块的接口的时候,只需要暴露出一个实例对象就能 ...

  10. 设计模式学习心得<单利模式 Singleton>

    概述 意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 主要解决 一个全局使用的类频繁地创建与销毁. 何时使用 当您想控制实例数目,节省系统资源的时候. 如何解决 判断系统是否已经有这个单 ...

随机推荐

  1. Codeforces_761_E_(dfs)

    E. Dasha and Puzzle time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  2. MFC_2.4 组合框和图片控件

    组合框和图片控件 1.拖控件 图片属性更改Type 为Bitmap 名字也要改,不能为IDC_STATIC 绑定变量控件,重命名. 2.初始化 // 设置一个定时器,用于更新图片 SetTimer(0 ...

  3. ARX亮显问题

    转载一段acedSSSetFirst的用法仅供参考:打个比方,我创建了一个命令,这个命令的功能是提示用户选择,然后只过滤文本对象作为选择集,随后在屏幕上使得这个选择集的所有成员都亮显,并且能够显示出各 ...

  4. 写给新手的十一条 Docker 守则

    很多人最终还是决定使用 Docker 解决问题. Docker 的优点很多,比如: 一体化——将操作系统.库版本.配置文件.应用程序等全部打包装在容器里.从而保证 QA 所测试的镜像 (image) ...

  5. jquery onclick 问题

    var str = ''; for(var i = 0;i<data.list.length;i++){ str += "<tr><td>" + (i ...

  6. Python之实例属性和类属性

    参考原文 廖雪峰Python 实例属性和类属性 在前面已经说过由于Python是动态语言,可以根据类的实例绑定任何的属性. 给实例绑定属性的方法是通过实例变量,或者self变量绑定的: class S ...

  7. 字符串系列——KMP模板整理

    KMP模板整理 KMP与扩展KMP: /*vs 2017/ vs code以外编译器,去掉windows.h头文件和system("pause");*/ #include<i ...

  8. Python生成随机不重复姓名昵称

    姓采用百家姓,名字从常用名字高频字选取两个汉字,再和当前时间戳组合,估计应该是不会重复了,代码如下: # -*- coding:utf-8 -*- import random import time ...

  9. IIS部署网站只有首页能访问,其他链接失效/运行.net+Access网站-可能原因:IIS未启用32位应用程序模式

    在64位的机子上IIS运行32位的.NET程序 由于64位操作系统不支持Microsoft OLE DB Provider for Jet驱动程 也不支持更早的Microsoft Access Dri ...

  10. ajax加载本地html文件出现 XMLHttpRequest cannot load的问题

    谷歌浏览器ajax加载本地html文件出现 XMLHttpRequest cannot load的问题(火狐中不会出现这问题) Cross origin requests are only suppo ...