美文网首页
iOS开发多线程篇—单例模式(ARC)

iOS开发多线程篇—单例模式(ARC)

作者: 不会打滚儿的狮子 | 来源:发表于2016-07-03 10:59 被阅读60次

    iOS开发多线程篇—单例模式(ARC)

    一、简单说明:

    设计模式:多年软件开发,总结出来的一套经验、方法和工具

    java中有23种设计模式,在ios中最常用的是单例模式和代理模式。

    二、单例模式说明

    (1)单例模式的作用 :可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问,从而方便地控制了实例个数,并节约系统资源。

    (2)单例模式的使用场合:在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次),应该让这个类创建出来的对象永远只有一个。

    (3)单例模式在ARC\MRC环境下的写法有所不同,需要编写2套不同的代码

    可以用宏判断是否为ARC环境

    #if__has_feature(objc_arc)

    //ARC

    #else

    //MRC

    #endif

    (4)在ARC中,单例模式的实现思路

    在.m中保留一个全局的static的实例   static id _instance;

    1)重写allocWithZone:方法,在这里创建唯一的实例(注意线程安全)

    1+ (id)allocWithZone:(struct_NSZone *)zone2{    @synchronized(self) {3if(!_instance) {4_instance = [super allocWithZone:zone];5}6}7return_instance;8}

    2)提供1个类方法让外界访问唯一的实例

    + (instancetype)sharedSoundTool2{3@synchronized(self) {

    if(!_instance) {

    _instance = [[self alloc] init];

    }

    }

    return_instance;

    }

    3)实现copyWithZone:方法

    1+ (id)copyWithZone:(struct_NSZone *)zone2{3return_instance;4}

    (5)非ARC中(MRC),单例模式的实现(比ARC多了几个步骤)

    实现内存管理方法

    - (id)retain { return self; }

    - (NSUInteger)retainCount { return 1; }

    - (oneway void)release {}

    - (id)autorelease { return self; }

    三、单例模式(ARC)

    1.说明

    重写allocWithzone:方法,控制内存分配。因为alloc内部会调用该方法,每次调用allocWithzone:方法,系统都会创建一块新的内存空间。

    alloc方法中:永远只分配一次内存

    init方法中:保证所有的MP3数据都只加载一次。

    2.代码示例

    创建一个音频工具类,继承子NSObject类。

    在该类中实现以下代码,观察:

    1//

    2//YYAudioTool.m3

    //06-单例模式

    14//

    #import"YYAudioTool.h"

    10@interfaceYYAudioTool ()

    11//用来保存mp3文件

    12@property(nonatomic,strong)NSMutableDictionary *muscis;

    13@end

    14@implementationYYAudioTool

    15//构造方法

    16-(id)init

    17{

    18if(self=[super init]) {

    19//加载所需的音乐资源

    21//self.muscis=[NSMutableDictionary dictionary];

    22//self.muscis[@"1.mp3"]=1mp3数据;

    23//self.muscis[@"2.mp3"]=2mp3数据;

    25returnself;

    28//两个方法的调用

    29+(id)alloc

    30{

    31NSLog(@"alloc----");

    32return[super alloc];

    33}

    35//控制内存分配,每次调用allocWithzone:方法,系统都会创建一块新的内存空间36+(id)allocWithZone:(struct_NSZone *)zone

    37{38NSLog(@"allocWithZone---");

    39return[super allocWithZone:zone];

    @end

    在主控制器中,创建工具类对象:

    2//YYViewController.m

    3//06-单例模式

    14//

    5//Created by apple on 14-6-25.

    6//Copyright (c) 2014年 itcase. All rights reserved.

    7//#import"YYViewController.h"

    10#import"YYAudioTool.h"

    12@interfaceYYViewController ()

    14@end

    16@implementationYYViewController

    18- (void)viewDidLoad

    {20[super viewDidLoad];

    21YYAudioTool *tool1=[[YYAudioTool alloc]init];

    22YYAudioTool *tool2=[[YYAudioTool alloc]init];

    23YYAudioTool *tool3=[[YYAudioTool alloc]init];

    24YYAudioTool *tool4=[[YYAudioTool alloc]init];

    25NSLog(@"%p--%p--%p--%p",tool1,tool2,tool3,tool4);

    26}

    28@end

    打印结果:

    说明:在alloc内部会调用更底层的方法allocWithZone方法分配内存空间,上面的代码创建了四个不同的对象。

    3.单例模式:设计思路

    (1)永远只分配一块内存来创建对象

    (2)提供一个类方法,返回内部唯一的一个变量

    (3)最好保证init方法也只初始化一次

    代码示例:

    创建一个音频工具类,继承子NSObject类。

    在该类中按照设计思路实现以下代码:

    YYAudioTool.m文件

    9#import"YYAudioTool.h"

    10@interfaceYYAudioTool ()

    11//用来保存mp3文件

    12@property(nonatomic,strong)NSMutableDictionary *muscis;

    13@end

    15@implementationYYAudioTool

    16//定义一份变量(整个程序运行过程中,只有一份)

    17staticid_instace;

    18//单例模式:设计

    19//(1)永远只分配一块内存来创建对象

    20//(2)提供一个类方法,返回内部唯一的一个变量

    21//(3)最好保证init方法也只初始化一次

    23//构造方法

    24-(id)init

    25{

    26//__block id obj=nil;

    27staticidobj=nil;

    28staticdispatch_once_t onceToken;

    29dispatch_once(&onceToken, ^{

    30if((obj=[super init]) != nil) {

    31//加载所需的音乐资源

    32//....

    33//self.muscis=[NSMutableDictionary dictionary];

    34//self.muscis[@"1.mp3"]=1mp3数据;

    35//self.muscis[@"2.mp3"]=2mp3数据;

    36}

    37});38self=obj;

    40returnself;

    41}

    44//重写该方法,控制内存的分配,永远只分配一次存储空间

    45+(id)allocWithZone:(struct_NSZone *)zone

    46{

    48//里面的代码只会执行一次

    49staticdispatch_once_t onceToken;

    50dispatch_once(&onceToken, ^{

    51_instace=[super allocWithZone:zone];

    52});53return_instace;

    54}

    56//类方法

    57+(id)sharedAudioTool

    58{

    59//里面的代码永远都只执行一次

    60staticdispatch_once_t onceToken;

    61dispatch_once(&onceToken, ^{

    62_instace=[[self alloc]init];

    63});

    64return_instace;

    65}

    67+(id)copyWithZone:(struct_NSZone *)zone

    68{69return_instace;70}71@end

    YYAudioTool.h文件

    1#import23@interfaceYYAudioTool : NSObject4//提供一个类方法,返回内部唯一的一个变量5+(id)sharedAudioTool;6@end

    主控制器中创建对象:

    1//

    2//YYViewController.m

    3//06-单例模式1

    9#import"YYViewController.h"

    10#import"YYAudioTool.h"

    12@interfaceYYViewController ()

    14@end

    16@implementationYYViewController

    18- (void)viewDidLoad

    {20[super viewDidLoad];

    21//YYAudioTool *tool1=[[YYAudioTool alloc]init];

    22//YYAudioTool *tool2=[[YYAudioTool alloc]init];

    23YYAudioTool *tool1=[YYAudioTool sharedAudioTool];

    24YYAudioTool *tool2=[YYAudioTool sharedAudioTool];

    25YYAudioTool *tool3=[[YYAudioTool alloc]init];

    26YYAudioTool *tool4=[[YYAudioTool alloc]init];

    27NSLog(@"%p--%p--%p--%p",tool1,tool2,tool3,tool4);

    }

    30@end

    观察打印结果:

    说明:整个程序中只创建一个对象实例。

    4.static补充:

    注意:static id instace=nil;和static id instace;instace=nil;的区别

    相关文章

      网友评论

          本文标题:iOS开发多线程篇—单例模式(ARC)

          本文链接:https://www.haomeiwen.com/subject/fazqjttx.html