單例的模式在網上有很多,今天發下我個人對單例模式的理解。整個app中只存在一個實例,也只會進行一次實例,在實例完成之后是不可以人釋放的(當App關閉之后,等系統自己回收)。
也就是說,如果我們寫得某個類符合了上述條件,那么我們也可以稱這個類為單例。
在非ARC的工程中,我們需要針對alloc,retain,copy等會增加retaincount的參數加以控制,對release和autorelease等減少retailcount的操作增加控制,以確保單一實例,絕不釋放。
在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單例就不在這里贅述了,相信大家都懂了。。。嘿嘿
|
新聞熱點
疑難解答