2013-08-17 14:50
14人閱讀收藏
舉報ios 單例
單例模式顧名思義就是只有乙個例項,它確保乙個類只有乙個例項,並且自行例項化並向整個系統提供這個例項。它經常用來做應用程式級別的共享資源控制。這個模式使用頻率非常高,通過乙個單例類,可以實現在不同視窗之間傳遞資料。
在objective-c中要實現乙個單例類,至少需要做以下四個步驟:
1、為單例物件實現乙個靜態例項,並初始化,然後設定成nil,
2、實現乙個例項構造方法檢查上面宣告的靜態例項是否為nil,如果是則新建並返回乙個本類的例項,
3、重寫allocwithzone方法,用來保證其他人直接使用alloc和init試圖獲得乙個新例項的時候不產生乙個新例項,
4、適當實現allocwithezone,copywithzone,release和autorelease
1.單例模式的要點:
顯然單例模式的要點有三個;
一是某個類只能有乙個例項;
二是它必須自行建立這個例項;
三是它必須自行向整個系統提供這個例項。
2.單例模式的優點:
1.例項控制:singleton 會阻止其他物件例項化其自己的 singleton 物件的副本,從而確保所有物件都訪問唯一例項。
2.靈活性:因為類控制了例項化過程,所以類可以更加靈活修改例項化過程
將類方法與單例相結合,便可以在程式的任何地方訪問靜態例項,而無需使用指向物件的指標或儲存它的例項變數。建立類的唯一例項(普通單例)的函式示例:
static surveyruntimedata *sharedobj = nil; //第一步:靜態例項,並初始化。
@implementation surveyruntimedata
+ (surveyruntimedata*) sharedinstance //第二步:例項構造檢查靜態例項是否為nil
} return sharedobj; }
+ (id) allocwithzone:(nszone *)zone //第三步:重寫allocwithzone方法
} return nil; }
- (id) copywithzone:(nszone *)zone //第四步
- (id) retain
- (unsigned) retaincount
- (oneway void) release
- (id) autorelease
- (id)init
} @end
1、synchronized 這個主要是考慮多執行緒的程式,這個指令可以將 內的**限制在乙個執行緒執行,如果某個執行緒沒有執行完,其他的執行緒如果需要執行就得等著。 用來控制多執行緒同步解決方案,保證此時沒有其他執行緒對anobj物件進行修改
2、網上搜尋的**,好像有乙個沒有加入 autorelease,我覺得應該需要加。因為如果呼叫的函式沒有release就麻煩了(我覺得,ios 上的程式,對於建立用於函式返回值的,都應該考慮 autorelease)。
3、allocwithzone 這個是過載的,因為這個是從制定的記憶體區域讀取資訊建立例項,所以如果需要的單例已經有了,就需要禁止修改當前單例,所以返回 nil。
nszone: 簡單來說可以把它想象成乙個記憶體池,alloc或者dealloc這些操作都是在這個記憶體池中操作的,cocoa總是會分配乙個預設的nszone,任何 預設記憶體操作都是在這個zone上進行的,使用預設zone存在缺陷,因為他是全域性範圍的,頻繁使用會導致記憶體的碎片化,尤其是大量的alloc和 dealloc的時候,效能上會受到一定影響。因為你完全可以自己生成乙個zone並將alloc,copy這些限制在這個zone中。
iOS單例學習筆記整理
單例模式顧名思義就是只有乙個例項,它確保乙個類只有乙個例項,並且自行例項化並向整個系統提供這個例項。它經常用來做應用程式級別的共享資源控制。這個模式使用頻率非常高,通過乙個單例類,可以實現在不同視窗之間傳遞資料。在objective c中要實現乙個單例類,至少需要做以下四個步驟 1 為單例物件實現乙...
單例模式整理
單例模式的使用場景 配置檔案的讀取。如日誌檔案,應用配置 該伺服器的配置資訊存放在乙個檔案中,這些配置資料由乙個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件獲取這些配置資訊 控制資源的情況下,方便資源之間的互相通訊。如執行緒池等 資料庫連線操作 增刪改 如果非單例,就會有很多的物件例...
單例模式學習筆記
單例 優點1.減少記憶體開支 2.減少效能開銷 3.寫檔案時避免資源多重占用 4.優化共享資源訪問 缺點1.自行例項化的特點導致無法擴充套件,只能修改原始碼 2.對測試不利,只有全部完成單例 才能測試 3.與單一職責原則有衝突 適用1.生成唯一序列號的環境 2.整個專案需要乙個共享訪問點 3.建立物...