IOS 之 单例

    单例就是一个类在此程序里只有唯一实例,每次总是返回自己的同一个实例.

何时使用单例:

1.类只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如工厂方法.

2.这个唯一的实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端代码.


以下是创建比较严格的方法:

头文件

@interface Singleton : NSObject
{
}

+ (Singleton *) sharedInstance;

@end

源文件

#import "Singleton.h"

@implementation Singleton
static Singleton *sharedSingleton = nil;

+ (Singleton*) sharedInstance
{
    if( sharedSingleton  == nil ){
         //因为重载了此类的allocWithZone所以使用父类的内存分配方法
         sharedSingleton = [[super allocWithZone:Null] init];
    }
    return sharedSingleton;
}

+ (id) allocWithZone:(NSZone*)zone
{
	return [self sharedinstance];
}

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

- (id) retain
{
	return self;
}

- (NSUInteger) retainCount
{
	return NSUIntegerMax;
}

- (id) release
{
}

- (id) autorelease
{
	return self;
}
@end

要是想子类化单例的话,只需要把

sharedSingleton = [[super allocWithZone:Null] init];

这里改成

sharedSingleton = [NSAllocateObject([self class], 0, NULL) init];

这样的话子类化单例后,分配的就是子类的对象了.

如果单例对象要由多个线程访问,那么使它的线程安全至关重要.需要加线程保护了.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值