ios中单例的写法

来源:互联网 发布:暴力破解rar密码软件 编辑:程序博客网 时间:2024/05/18 22:46

最主要就是两步:

1.重写allocwithzone,dispatch_once实例化一个静态变量

 2.写一个+sharedXXX方便其他类调用


要注意使用GCD的方法来保证在dispatch中的代码只执行一次。

DemoObj.m中的代码:

////  DemoObj.m//  testdanli////  Created by 娟娟 on 15/11/3.//  Copyright (c) 2015年 娟娟. All rights reserved.//<strong style="color: rgb(255, 0, 0);">#import "DemoObj.h"@implementation DemoObj/* 1.重写allocwithzone,用dispatch_once实例化一个静态变量 2.写一个+sharedXXX方便其他类调用 *///在ios中,所有对象的内存空间的分配最终都会调用allocwithzone方法//如果做单例,需要重写此方法//GCD提供了一个方法,专门用来创建单例的+(id)allocWithZone:(struct _NSZone *)zone{    static DemoObj * instance ;    //dispatch_once是线程安全的,onceToken默认为0    static dispatch_once_t onceToken;    //这个宏可以保证快代码中的指令只被执行一次    dispatch_once(&onceToken,^{            //永远只会被执行一次,instance只会被实例化一次        instance = [super allocWithZone:zone];    });    return instance;}//共享实例,便于其他类访问+(instancetype)sharedDemoObj{    return [[self alloc]init];}@end</strong>

ViewController中的方法:

////  ViewController.m//  testdanli////  Created by 娟娟 on 15/11/3.//  Copyright (c) 2015年 娟娟. All rights reserved.//#import "ViewController.h"#import "DemoObj.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.    DemoObj *obj = [[DemoObj alloc]init];        NSLog(@"%@",obj);        for (int i = 0; i<10; i++) {        DemoObj *obj1 = [DemoObj sharedDemoObj];        NSLog(@"%@",obj1);    }}@end


可以在打印中看到,每次地址都是一样的,实际上返回的是同一个对象。


单例是一种常用的软件设计模式:

通过单例模式可以保证系统中一个类只有一个实例。

优点:

      可以阻止其他对象实例化单例对象的副本,从而确保所有对象都访问唯一实例。

缺点:

      单例对象一旦建立,对象指针是保存在静态区的,单例对象在堆中分配的内存空间,会在应用程序终止后才会被释放。

提示:

      只有确实需要唯一使用的对象才需要考虑单例模式,不要滥用单例。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 京东地址错了怎么办 没买运费险退货怎么办 没有买运费险退货怎么办 买的运费险换货怎么办 顾客买衣服说贵怎么办 卖衣服顾客说贵怎么办 汽车前保险杠刮蹭怎么办 洗手盆下水管堵了怎么办 装修好的卫生间漏水怎么办 马桶水箱盖碎了怎么办 马桶陶瓷盖碎了怎么办 电脑左右分屏了怎么办 在东东助手里安装软件怎么办 王者荣耀进入安全系统怎么办 京东限时达超时怎么办 京东京准达晚点怎么办 京东京准达超时怎么办 南京犬类免疫证怎么办 合肥犬类免疫证怎么办 快递号码写错了怎么办 网购下单后商家说没有货该怎么办 京东账号换手机怎么办 手机不发验证码怎么办 京东打白条分期付款额度不够怎么办 网易云音乐昵称被占用怎么办 ebay账号邮箱忘了怎么办 易贝账号邮箱忘了怎么办 运动鞋网上擦了黑鞋油怎么办 真皮鞋用水洗了怎么办 支付宝余额限额了怎么办 微信余额转账限额怎么办 微信充值话费充错了怎么办 京东白条月限额怎么办 淘手游上买的账号被找回了怎么办 手机看视频缓冲慢怎么办 wan口状态未连接怎么办 王者荣耀本地回放过期怎么办 qq邮件发错了怎么办 千叶钻戒换款怎么办 车钥匙掉厕所了怎么办 宿舍有个整晚磨牙的室友该怎么办