黑马程序员————IOS学习笔记 第12篇 关于单例设计模式的认识

  ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 

    今天在准备入学考试,发现了一个不清楚的概念:单例设计模式,因此上网查了一些资料并且整理,又学到了新的知识。

    单例模式常用在只需要一个实例的类的情况下,即这个类只能有一个实例对象。单例模式可以减少内存资源的浪费,而且方便外界的访问。单例模式保证一个类仅有一个实例,并且提供一个访问它的全局访问点在jave和oc开发中都有这种模式。举一个例子来说明单例模式的动机,如在Windows下打开任务管理器时只能打开一个该窗口,则就需要将该窗口对象采用单例模式才能实现,这种机制可以防止多个窗口打开,防止内存浪费和混乱任务管理器的管理原则。

  单例设计的三个关键:

一是单例模式的类只提供私有的构造函数,

二是类定义中含有一个该类的静态私有对象,

三是该类提供了一个静态的共有的函数用于创建或获取它本身的静态私有对象

下面是在网上找的一个代码实现:

user.h

#import <Foundation/Foundation.h>

@interface User : NSObject<NSCopying> //拷贝协议表明该对象可被拷贝,尽管都是同一个(因为是单例)
@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSString *email;
//一般用share或者default做前缀,易于阅读标记为单例共享方法
+(id)shareUser;
@end

user.m

#import "User.h"
static User *user1=nil; //先定义一个空得静态实例,   关键一
@implementation User
+(id)shareUser{
    @synchronized(self){ //线程锁,防止多线程访问冲突
       if (user1==nil) { //判断这个实例是否为空,即是否已被创建
        user1=[[[self class ]alloc]init];//如果没被创建,就初始化一个    关键二 
       }
    }
    return user1; //如果已存在,则不创建,直接返回即可
}               
<span style="font-family: Arial, Helvetica, sans-serif;">//关键三  这是在非ARC下的要做到的防止创建多个对象 </span>
//以下都是防止实例不是唯一的一些方法,是通用格式,不必死记硬背,可以直接拷贝到任何单例模式中
//这是在调用alloc时可防止重复创建实例
+(id)allocWithZone:(NSZone *)zone{
    if (user1==nil) {
        user1=[super allocWithZone:zone];
    }
    return user1;
}
//这是在拷贝对象时防止重复创建
-(id)copyWithZone:(NSZone *)zone{
    return user1;
}
//这是在retain对象时防止重复创建,当然在ARC开启时可省略这个
-(id)retain{
    return user1;
}
//在release时什么都不做,因为一共就一个实例,不重复引用,所以不能release
-(oneway void)release{
    
}
//在autorelease时,返回实例,在ARC下客省略
-(void)autorelease{
    return user1;
}
//返回的时无符号整型,即大于0的数字,在ARC下可省略
-(NSUInteger)retainCount{
    return UINT_MAX;
}
@end
main.m

#import <Foundation/Foundation.h>
#import "User.h"

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        User *user1=[User shareUser];
        User *user2=[User shareUser];
        User *user3=[[User alloc]init];
        User *user4=[user1 copy];
        NSLog(@"%@,%@,%@,%@",user1,user2,user3,user4);
    }
    return 0;
}

如果这个实例模型成功那么最后user1,user2,user3,user4 的地址是一样的地址。         


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值