單例的模式在網上有很多,今天發下我個人對單例模式的理解。整個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單例就不在這裡贅述了,相信大家都懂了。。。嘿嘿