程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> [Objective-C]OC中單例設計模式講解

[Objective-C]OC中單例設計模式講解

編輯:關於C語言

基本概念:

單例設計模式是運用較為普遍,廣泛且較為簡單的設計模式之一,它的設計原理是

始終返回一個實例,即一個類始終只有一個實例

\

創建單例設計模式的基本步驟

1:聲明一個單例對象的靜態實例,並初始化為nil

2:創建一個類的類方法,生成一個該類的實例,當且僅有這個類實例nil時,進行實例化

3:覆蓋allocWithZone:方法,確保用戶直接分配和初始化的事後,不會產生新的對象

4:實現NSCopying協議,覆蓋release,autorelease,retain,retainCount方法,以此確保單例的狀態

5:在多線程的環境中,注意要使用@synchronized關鍵字,確定靜態實例被正確和初始化

 

單例的基本實現:

實例,UserContext.h頭文件:

 

#import 

@interface UserContext : NSObject 
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *email;

//單例 類方法
+(id)shareUserContext;
@end
UserContext.m實現文件:

 

 

#import "UserContext.h"
//單例對象
static UserContext *sigletonInstance=nil;
@implementation UserContext
//生成單例對象
+(id)shareUserContext{
    @synchronized(self){
    if (sigletonInstance==nil) {
        sigletonInstance=[[[self class] alloc]init];
       }
    }
    return sigletonInstance;
}
//下面的方法確保只有一個實例對象
+(id)allocWithZone:(NSZone *)zone{
    if (sigletonInstance==nil) {
        sigletonInstance=[super allocWithZone:zone];
    }
    return  sigletonInstance;
}
-(id)copyWithZone:(NSZone *)zone{
    return  sigletonInstance;
}
-(id)retain{
     return  sigletonInstance;
}
-(oneway void)release{
    
}
-(id)autorelease{
    return  sigletonInstance;
}
-(NSUInteger)retainCount{
    return UINT_MAX;
}
@end
main.m測試代碼:

 

 

#import 
#import "UserContext.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {
        UserContext *userContext1=[UserContext shareUserContext];
        UserContext *userContext2=[UserContext shareUserContext];
        UserContext *userContext3=[[UserContext alloc]init];
        UserContext *userContext4=[userContext3 copy];
        [userContext1 release];
        [userContext1 release];
        [userContext1 release];
        [userContext1 release];
        NSLog(@" ");
    }
    return 0;
}
運行截圖

 

\

看上面四個對象的內存地址一樣,說明這四個對象為同一個對象。這樣就可以實現單例了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved