OC学习笔记20--OC中singleton的实现

#import <Foundation/Foundation.h> 


@interface MySingleton :NSObject<NSCopying>
{
	@private
	NSMutableDictionary * _dict;
}
// 对外部提供获取唯一实例的类方法
+(id)shareMySingleton;
-(NSMutableDictionary *)dict;
@end
   
   
int main(int argc, const char * argv[])  
{        
    NSAutoreleasePool *pool =[[NSAutoreleasePool alloc] init];
    
    MySingleton *s1=[MySingleton shareMySingleton];
    [[s1 dict] setValue:@"value01" forKey:@"key01"];
    
    //单例对象无论怎么创建都是返回同一个唯一实例,也不会被销毁
    MySingleton *s2=[[MySingleton shareMySingleton] autorelease];
    MySingleton *s3=[[[MySingleton alloc] init] retain];
    MySingleton *s4=[s3 copy];
    [s4 release];

    NSLog(@"\ns1=%@,s2=%@,s3=%@,s4=%@\n%lu,%lu",s1,s2,s3,s4,
    [s4 retainCount],[[s4 dict] retainCount]);
    
    [pool drain];
    
     NSLog(@"\ns1=%@,s2=%@,s3=%@,s4=%@\n%lu,%lu",s1,s2,s3,s4,
    [s4 retainCount],[[s4 dict] retainCount]);
     
     return 0;  
}

// 全局变量定义为static,限制在本文件中访问
static MySingleton * _mySingleton = nil;

@implementation MySingleton
+(id)shareMySingleton
{
	// 使用线程锁保证线程安全
	if(!_mySingleton)
	{
		@synchronized(self)
		{
			if(!_mySingleton)
			{
				_mySingleton=[[self alloc] init];
				// 此处应该用alloc创建对象,防止被自动释放池释放
				_mySingleton->_dict=[[NSMutableDictionary alloc] init];
			}
		}
	}
	return _mySingleton;
	
}

-(NSString *)description
{
	return [NSString stringWithFormat:@"%@",_dict];
}
-(NSMutableDictionary *)dict
{
	return _dict;
}



// 重写类的创建方法,alloc方法中调用该方法
+(id)allocWithZone:(NSZone *)zone
{
	if(!_mySingleton)
	{
		@synchronized(self)
		{
			if(!_mySingleton)
			{
				_mySingleton=[super allocWithZone:zone];
				
			}
		}
	}
	return _mySingleton;
	
}


-(id)copyWithZone:(NSZone *)zone
{
	return self;
}

-(id)retain
{
	return self;
}


-(oneway void)release
{
}


-(id)autorelease
{
	return self;
}

-(NSUInteger)retainCount
{
	return UINT_MAX;
}


@end








实现步骤:
1> 要实现singleton的类中提供一个类方法与外界分享
自己的唯一实例对象
2> 该类的实现文件中,声明一个static(表示该全局变量作用域只能在当前文件中)
的该类全局变量,存放唯一实例
3> 该类中重写那些关于产生新对象或销毁对象的方法,防止产生多个实例
和防止销毁唯一实例(单例对象一般在整个程序退出后才销毁)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值