MRC

作者: 143db5b5572a | 来源:发表于2016-07-03 00:22 被阅读0次

    //

    //  CZSoundTool.m

    //  06-GCD单例(ARC)

    //

    //  Created by LNJ on 14-6-26.

    //  Copyright (c) 2014年itcast. All rights reserved.

    //

    #import"CZSoundTool.h"

    @implementationCZSoundTool

    /**

    创建单例的步骤

    1.定义一个全局的静态变量,用来记录“第一次”被实例化出来的对象

    2.重写allocWithZone方法,此方法是为对象分配内存空间必须会被调用的一个方法!

    因此,在此方法中使用"dispatch_once",能够保证在多线程中,_instance也只能被“分配”一次空间

    3.定义一个sharedXXX“类”方法,方便其他使用单例的对象调用此单例

    在此方法中,同样使用"dispatch_once",保证使用类方法调用的对象,只会被初始化一次!

    注释:如果不考虑copy & MRC,以上三个步骤即可!

    4.如果要支持copy,则需要

    1>遵守NSCopying协议

    2>在copyWithZone方法中,直接返回_instance

    =========================================

    */

    staticCZSoundTool*_instance;

    //在实际给对象分配内存空间时,最终都会调用此方法!

    + (id)allocWithZone:(struct_NSZone*)zone

    {

    //类似的代码

    // 1>如果是多条线程同时分配对象,不能保证唯一性,“非线程安全”

    //    if (!_instance) {

    //        _instance = [super allocWithZone:zone];

    //    }

    //    return _instance;

    // 2>要保证线程安全,使用互斥锁,互斥锁的性能非常不好!

    //    static int token = 0;

    //    @synchronized(self) {

    //        if (token == 0) {

    //            _instance = [super allocWithZone:zone];

    //            token = 1;

    //        }

    //

    //        return _instance;

    //    }

    //在此方法中,只要返回唯一的对象就可以了

    staticdispatch_once_tonceToken;

    dispatch_once(&onceToken, ^{

    //此处的代码可以保证在多线程中,只会被执行一次!

    _instance= [superallocWithZone:zone];

    });

    return_instance;

    }

    + (instancetype)sharedSoundTool

    {

    staticdispatch_once_tonceToken;

    dispatch_once(&onceToken, ^{

    // 1. MRC修改的第一点,增加autorelease

    _instance= [[[CZSoundToolalloc]init]autorelease];

    });

    return_instance;

    }

    - (id)copyWithZone:(NSZone*)zone

    {

    return_instance;

    }

    #pragma mark - MRC需要重写的方法,目的就是覆盖系统默认的内存管理方法

    //默认引用计数加1

    - (id)retain

    {

    //单例中不需要增加引用计数

    returnself;

    }

    //在MRC中,使用过autorelease分配的对象,延迟销毁,出了作用域之后,会被放到自动释放池中

    //只有“堆”中的对象,才需要放到自动释放池中!

    - (id)autorelease

    {

    //单例中不需要延迟销毁

    returnself;

    }

    // retainCount表示有多少个对象对当前对象进行强引用,系统底层的框架同样会引用

    //实际开发中,跟踪引用技术数值是毫无意义的事情!

    - (NSUInteger)retainCount

    {

    //单例中不需要修改引用计数,返回最大的无符号整数

    //    return 1;

    returnUINT_MAX;

    }

    - (onewayvoid)release

    {

    //在单例中,啥也不用做!

    }

    #pragma mark -对象初始化方法

    //单例对象只应该被初始化一次

    - (instancetype)init

    {

    self= [superinit];

    if(self) {

    }

    returnself;

    }

    #pragma mark -成员方法

    - (void)playSoundWithName:(NSString*)name

    {

    NSLog(@"播放%@", name);

    }

    @end

    相关文章

      网友评论

          本文标题:MRC

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