iOS开发——实用技术OC篇&单例模式的实实现(ACR&MRC)

  单例模式的实实现(ACR&MRC)

在iOS开发中单例模式是一种非常常见的模式,虽然我们自己实现的比较少,但是,系统却提供了不少的到来模式给我们用,比如最常见的UIApplication,Notification等,

那么这篇文章就简单介绍一下,我们开发中如果想要实现单例模式要怎么去实现!

单例模式顾名思义就是只有一个实例,它确保一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。它经常用来做应用程序级别的共享资源控制。这个模式使用频率非常高,通过一个单例类,可以实现在不同窗口之间传递数据。

在objective-c(MRC)中要实现一个单例类,至少需要做以下四个步骤:

  • 1、为单例对象实现一个静态实例,并初始化,然后设置成nil,
  • 2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例,
  • 3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实例的时候不产生一个新实例,
  • 4、适当实现allocWitheZone,copyWithZone,release和autorelease

例子:为RootViewController创建一个单例函数:

代码如下,可直接拷贝到头文件中

 1 #define singleton_h(name) +(instancetype)shared##name
 2 # if __has_feature(objc_arc) //ARC
 3
 4 #define singleton_m(name)  5 static id _instance; 6 +(id)allocWithZone:(struct _NSZone *)zone 7 { 8     static dispatch_once_t onceToken; 9     dispatch_once(&onceToken, ^{10         _instance = [super allocWithZone:zone];11     });12     return _instance;13 }14 15 +(instancetype)shared##name16 {17     static dispatch_once_t onceToken;18     dispatch_once(&onceToken, ^{19         _instance = [[self alloc] init];20     });21     return _instance;22 }23 24 +(id)copyWithZone:(struct _NSZone *)zone25 {26     return _instance;27 }
28 #else //非ARC
29 #define singleton_m(name) 30 static id _instance;31 +(id)allocWithZone:(struct _NSZone *)zone32 {33 static dispatch_once_t onceToken;34 dispatch_once(&onceToken, ^{35 _instance = [super allocWithZone:zone];36 });37 return _instance;38 }39 40 +(instancetype)shared##name41 {42 static dispatch_once_t onceToken;43 dispatch_once(&onceToken, ^{44 _instance = [[self alloc] init];45 });46 return _instance;47 }48 49 +(id)copyWithZone:(struct _NSZone *)zone50 {51 return _instance;52 }53 -(oneway void)release54 {55     56 }57 -(instancetype)autorelease58 {59     return _instance;60 }61 -(instancetype)retain62 {63     return _instance;64 }65 -(NSUInteger)retainCount66 {67     return 1;68 }

但是在非ARC中也就是MRC中实现的方式却不一样,我们需要做对应的内存管理。

MRC要重写四个方法:

 1 -(oneway void)release
 2
 3 {
 4
 5 }
 6
 7 -(instancetype)autorelease
 8
 9 {
10
11 return self;
12
13 }
14
15 -(instancetype)retain{
16
17 return self;
18
19 }
20
21 -(NSUInteger)retainCount{
22
23 return 1;
24
25 }
时间: 2024-08-02 02:47:32

iOS开发——实用技术OC篇&单例模式的实实现(ACR&MRC)的相关文章

iOS开发——实用技术OC篇&多线程整合

多线程整合 本文知识对iOS开发中多线程的一些知识整合,关于一些概念和技术问题并没有过多的介绍,如果你想了解更多请查看笔者之前写的iOS开发之多线程详解(比较完整):但是有部分涉及到之前文章中没有的技术点和常识,比如加锁的方式,面试相关的,还有一些关于GCD的高级用法,希望你能认真看完,或许可以收获到很多! http://www.cnblogs.com/iCocos/p/4553103.html http://www.cnblogs.com/iCocos/p/4553262.html ??先来看

iOS开发——实用技术OC篇&UIWebView与JS的交互

UIWebView与JS的交互 事情的起因还是因为项目需求驱动.折腾了两天,由于之前没有UIWebView与JS交互的经历,并且觉得这次在功能上有一定的创造性,特此留下一点文字,方便日后回顾. 我要实现这样一个需求:按照本地的CSS文件展示一串网络获取的带HTML格式的只有body部分的文本,需要自己拼写完整的HTML.除此之外,还需要禁用获取的HTML文本中自带的 < img > 标签自动加载,并把下载图片的操作放在native端来处理,并通过JS将图片在Cache中的地址返回给UIWebv

iOS开发——实用技术OC篇&amp;?Invocation简单介绍

Invocation简单介绍 方法一:运行时方法:(这里在之前的文章定时器的几种方法中说过:www.cnblogs.com/iCocos/p/4694581.html) 1:创建一个签名: NSMethodSignature *singature = [NSMethodSignature signatureWithObjCTypes:"[email protected]:"]; 这里我想如果你仔细的话肯定注意到了:后面的“[email protected]:”,这里是运行时的语法在这里

iOS开发——实用技术OC篇&amp;简单抽屉效果的实现

简单抽屉效果的实现 就目前大部分App来说基本上都有关于抽屉效果的实现,比如QQ/微信等.所以,今天我们就来简单的实现一下.当然如果你想你的效果更好或者是封装成一个到哪里都能用的工具类,那就还需要下一些功夫了,我们这里知识简单的介绍怎么去实现,不过一般我们开发都是找别人做好的,也没必要烂肺时间,除非你真的是大牛或者闲的蛋疼. 其实关于抽屉效果就是界面有三个View,其实一个主View其他两个分别是左边和右边的View,我们分别为他们添加手势,实现左右滑动显示对应的View. 一:所以,首先我们需

iOS开发——实用技术OC篇&amp;8行代码教你搞定导航控制器全屏滑动返回效果

8行代码教你搞定导航控制器全屏滑动返回效果 前言 此次文章,讲述的是导航控制器全屏滑动返回效果,而且代码量非常少,10行内搞定. 效果如图: 如果喜欢我的文章,可以关注我,也可以来小码哥,了解下我们的iOS培训课程.陆续还会有更新ing.... 一.自定义导航控制器 目的:以后需要使用全屏滑动返回功能,就使用自己定义的导航控制器. 二.分析导航控制器侧滑功能 效果:导航控制器默认自带了侧滑功能,当用户在界面的左边滑动的时候,就会有侧滑功能. 系统自带的侧滑效果: 分析: 1.导航控制器的view

iOS开发——实用技术OC篇&amp;事件处理详解

事件处理详解 一:事件处理 事件处理常见属性: 事件类型 @property(nonatomic,readonly) UIEventType     type; @property(nonatomic,readonly) UIEventSubtype  subtype; 事件产生的时间 @property(nonatomic,readonly) NSTimeInterval  timestamp; 事件传递 - hitTest:withEvent: SWIFT func hitTest(_ po

iOS开发——实用技术OC篇&amp;CocoaPods简单粗暴

CocoaPods简单粗暴 直接上代码,不要问为什么,照着做就可以,我也是这么做的,具体的细节,请查看相关文档,网上太多! 1:移除ruby镜像 1 $ gem sources --remove https://rubygems.org/ 2:新增淘宝镜像 1 $ gem sources -a http://ruby.taobao.org/ 3:查看列表 1 $ gem sources -l 4:正式安装 1 sudo gem install cocoapods 接下来就是开始使用了. 查看对应

iOS开发——实用技术OC篇&amp;NSTimer使用注意点及总结

NSTimer使用注意点及总结 总结以下在NSTimer的使用中遇到的一些问题: 1. 不要在dealloc函数中停止并释放NSTimer 如果这样做,会导致对象永远无法调用dealloc函数,也就是会造成内存泄漏. 一个比较合理的解释是NSTimer的回调方法具有retain属性,所以不停止它的情况下被引用对象的retainCount无法降为0,导致内存泄漏的死循环 2.因为要实现类似视频软件里面,UIScrollview定时循环滑动,用到了NSTimer类.在特定时事件情况下需要暂停,和重新

iOS开发——实用技术OC篇&amp;日期处理

日期处理 一:时间截 1 NSString *str=@"1368082020";//时间戳 2 3 NSTimeInterval time=[str doubleValue]+28800;//因为时差问题要加8小时 == 28800 sec 4 5 NSDate *detaildate=[NSDate dateWithTimeIntervalSince1970:time]; 6 7 NSLog(@"date:%@",[detaildate description]