說到單例,在java學習07-單例設計模式已經說的很清楚,Object-C也是一門面向對象的語言,於是除了寫法不同,其他都是大同小異.
---未來會出一套 "設計模式"學習的筆記
原則:
(1) 不能直接調用構造方法---私有
(2)對象內存只能初始化一次---static
(3)使用其他靜態接口(方法)把靜態的對象返回
廢話少說了,讓我們直接上程序吧.
//
// People.h
// Single
// DRAGON
// Created by 5016 on 13-12-2.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface People : NSObject<NScopying>
//定義靜態方法
+(People *)getInstance;
@end
//
// People.m
// Single
// DRAGON
// Created by 5016 on 13-12-2.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import "People.h"
@implementation People
static People *single = nil;
+(People *)getInstance
{
@synchronized(self)//線程鎖,可以不使用,使用之後使線程安全,但是執行速率下降
{
if (!single) {
single = [[[self class] alloc]init];
}
}
return single;
}
#pragma mark 下面方法確保只有一個實例
//當調用alloc
+(id)allocWithZone:(NSZone *)zone
{
if (!single) {
single = [super allocWithZone:zone];
}
return single;
}
//覆蓋copy協議
-(id)copyWithZone:(NSZone *)zone
{
return single;
}
-(id)retain
{
return single;
}
-(oneway void)release
{
}
-(id)autorelease
{
return single;
}
-(NSUInteger)retainCount
{
return UINT_MAX;//返回一個>0的值
}
-(void)dealloc
{
[super dealloc];
}
@end
//
// main.m
// Single
// DRAGON
// Created by 5016 on 13-12-2.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "People.h"
int main(int argc, const char * argv[])
{
People* person1 = [People getInstance];
People* person2 = [People getInstance];
//判斷是否爲同一對象堆內存空間
if (person1 == person2) {
NSLog(@"true");//當然是打印true
}else{
NSLog(@"false");
}
return 0;
}
筆者認爲單例不需要使用同步,靜態區是一個獨立的內存塊,靜態修飾的變量或方法隨着類的加載而加載,只初始化一次,優先與對象的存在,就算啓動多個線程,也不可能再初始化靜態對象,使用同步會使系統內部增加判斷,負載增加,程序執行降低效率….
但是,有時候同步是必要的,詳細可以去看同步控制單例,http://www.ibm.com/developerworks/cn/java/l-singleton/