//  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_302D

    D. Yaroslav and Time time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  2. UI布局只关乎三件事情:尺寸、位置、组织

    UI布局只关乎三件事情:尺寸.位置.组织. 组织分为两类: 单元组织: 集合组织: 混合组织.

  3. 模块挂载、切换,uml模式、流程图模式

    模块挂载.切换,uml模式.流程图模式

  4. 梦想CAD控件关于曲线问题

    IMxDrawCurve 接口 控件中的曲线接口,实现了曲线的相关操作,如求曲线的长度,最近点,面积,曲线上任一点在曲线上的长度 切向方向,曲线交点,坐标变换,打断,偏移,离散等功能. 一.返回曲线组 ...

  5. 梦想MxWeb3D协同设计平台 2018.10.12更新

    SDK开发包下载地址: http://www.mxdraw.com/ndetail_10107.html 1. 全新的在线的三维协同设计平台,高效异步方式,基于JavaScript和WebGL技术,前 ...

  6. script标签属性sync和defer

    <script src="a.js" defer></script> 加了defer属性script标签的页面,运行流程如下:   1.浏览器开始解析HTM ...

  7. telnet mysql3306端口失败

    在linux上telnet远程mysql端口失败,经过上网查找后,找到多种方法. (1)我在本地的Navicat上新增了一个用户,主机名是linux的ip,也可以是 %(百分号代表这个用户可以在任何地 ...

  8. Xcode编译ffmpeg(2)

    iOS: FFmpeg编译和使用问题总结 折磨了我近一周多时间的FFmpeg库编译问题终于解决了,必须得把这一段时间来遇到过的坑全写出来.如果急着解决问题,编译最新版本的FFmpeg库请直接看第二部分 ...

  9. Datatable 导出到execl 官网demo

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content ...

  10. 使用Mybatis的逆向工程自动生成代码

    1.逆向工程的作用 Mybatis 官方提供了逆向工程,可以针对数据库表自动生成Mybatis执行所需要的代码(包括mapper.xml.Mapper.java.pojo). 2.逆向工程的使用方法 ...