zoukankan      html  css  js  c++  java
  • IOS开发模式——单例

      单例的模式在网上有很多,今天发下我个人对单例模式的理解。整个app中只存在一个实例,也只会进行一次实例,在实例完成之后是不可以人释放的(当App关闭之后,等系统自己回收)。

    也就是说,如果我们写得某个类符合了上述条件,那么我们也可以称这个类为单例。

      在非ARC的工程中,我们需要针对alloc,retain,copy等会增加retaincount的参数加以控制,对release和autorelease等减少retailcount的操作增加控制,以确保单一实例,绝不释放。  

      在ARC的工厂中,由于,内存管理是有系统来完成的,确切的说单例是不存在的,以为在内存吃紧的情况下,系统会回收,这样造成,可能重复实例。这样的话,你之前实例里面保存的数据就会丢失,所以说不存在。(个人理解)

      下面来分享下我是如何做单例的

    非ARC单例:

     

    #import <Foundation/Foundation.h>
    
    @interface BaseSingle : NSObject
    
    +(id)getInstance;
    
    @end

    .m文件中,重写方法增加控制

    #import "BaseSingle.h"
    
    @implementation BaseSingle
    
    +(id)getInstance{
        return nil;
    }
    
    +(id)allocWithZone:(struct _NSZone *)zone{
        return [[self getInstance] retain];
    }
    
    -(id)copyWithZone:(struct _NSZone *)zone{
        return self;
    }
    
    -(id)retain{
        return self;
    }
    
    -(NSUInteger)retainCount{
        return NSUIntegerMax;
    }
    
    -(oneway void)release{
        return;
    }
    
    -(id)autorelease{
        return self;
    }

    然后我们调用的时候继承下BaseSingle 重写 getInstance方法。

    例如:其中FileDownLoadManager 继承 BaseSingle

    +(FileDownLoadManager *)getInstance{
        static FileDownLoadManager * shareFileDownLoadManager = nil;
        @synchronized(self){
            if (shareFileDownLoadManager == nil) {
                shareFileDownLoadManager = [NSAllocateObject([self class], 0, NULL) init];
            }
        }
        return shareFileDownLoadManager;
    }

    这样一个妥妥的单例就完成了。

    ARC单例:

      关于ARC单例就不在这里赘述了,相信大家都懂了。。。嘿嘿

     

  • 相关阅读:
    event.relatedTarget、event.fromElement、event.toElement
    before/after伪类常见用法
    $.getJSON 跨域
    ExtJS中store.findExact
    C#生成6位随机验证码
    C#验证手机号
    jQuery轮播图的事项 代码详细,容易理解。。。。谢谢观赏
    ES6 中 static 的this 丢失问题解决办法 简单明了 备注清晰 谢谢欣赏
    ES6 中 static 的this 问题 简单明了 备注清晰 谢谢欣赏
    ES6 中用class创建img 详细明了,步骤清晰,解释完美,谢谢欣赏
  • 原文地址:https://www.cnblogs.com/ggxbq/p/3753255.html
Copyright © 2011-2022 走看看