单例的模式在网上有很多,今天发下我个人对单例模式的理解。整个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单例就不在这里赘述了,相信大家都懂了。。。嘿嘿