黑马程序员---OC学习笔记之简单的单例模式实现

——Java培训、Android培训、iOS培训、.Net培训——–

1、单利模式概念

1)什么事单例模式(Singleton)

单利模式的意图是使类的对象成为系统中唯一的实例,提供一个访问点,共客户类共享资源

2)什么情况下使用单例?

A、类只能有一个实例,且必须从一个为人熟知的访问点对其进行访问,比如工厂方法
B、这个唯一的实例只能通过子类化进行扩展,而且扩展的对象不能破坏客户端代码

3)单例设计模式的要点

A、某个类只能有一个实例
B、他必须自行创建这个对象
C、必须自行向整个系统提供这个实例
D、为了保证实例的唯一性,我们必须将
+(id)allocWithZone:(NSZone *)zone;
-(id)copyWithZone:(NSZone *)zone;
-(id)autorelease;
-(oneway void)release;
-(id)retain;
-(NSUInteger)retainCount;

4)实现代码

【SingletonTools.h文件】

#import 
//声明一个单例模式的类,遵守NSCopying协议
@interface SingletonTools : NSObject<NSCopying>

@property(nonatomic,assign) int length;
@property(nonatomic,copy) NSString *content;


//声明该单例的入口
+(id)shareInstance;
@end

【SingletonTools.m文件】

#import "SingletonTools.h"

//定义一个静态全局变量,存储该单例
static SingletonTools *instance;

@implementation SingletonTools

//实现该单例的入口
+(id)shareInstance{
    //目的:保证对象的唯一性
    if (nil == instance) {
        instance = [[SingletonTools alloc] init];
    }
    return instance;
}

//实现copy
-(id)copyWithZone:(NSZone *)zone{
    return self;
}

//重写alloc
+(id)allocWithZone:(NSZone *)zone{

    //目的:线程保护
    @synchronized(self){

        if (nil == instance) {
            instance = [super allocWithZone:zone];
        }
    }

    return instance;
}
-(id)retain{
    return self;
}

-(NSUInteger)retainCount{
    //直接放回一个整型最大值
    return NSIntegerMax;
}

-(oneway void)release{
    //Do nothing
}
-(id)autorelease{
    return self;
}
@end

【Person.h文件】

#import 

@interface Person : NSObject
-(void)run;
@end

【Person.m文件】

#import "Person.h"
#import "SingletonTools.h"
@implementation Person

-(void)run{
    //获取单例对象,并首次为该对象设置值
    SingletonTools *tools = [SingletonTools shareInstance];
    tools.content = @"单例实现";
    tools.length = tools.content.length;
    NSLog(@"\nPerson类:length = %d, content = %@",tools.length,tools.content);
}
@end

【Dog.h文件】

#import 

@interface Dog : NSObject
-(void)run;
@end

【Dog.m文件】

#import "Dog.h"
#import "SingletonTools.h"
@implementation Dog
-(void)run{

    //SingletonTools *tools = [SingletonTools shareInstance];

    //即使使用alloc也不会产生新对象,依然使用Person对象中设置的值
    SingletonTools *tools = [[SingletonTools alloc] init];    NSLog(@"\nDog类:length = %d, content = %@",tools.length,tools.content);
}
@end

【main.m文件】

#import 
#import "Person.h"
#import "Dog.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        //定义Person对象
        Person *p = [Person new];
        //调用run首次为单例设置值
        [p run];

        Dog *dog = [Dog new];
        [dog run];
    }
    return 0;
}

【打印结果】
2015-10-09 11:30:37.295 简单的单例实现[3932:303]
Person类:length = 4, content = 单例实现
2015-10-09 11:30:37.297 简单的单例实现[3932:303]
Dog类:length = 4, content = 单例实现

你可能感兴趣的:(Objective-C基础,黑马程序员,单例模式)