您的位置:首页 > 职场人生

——黑马程序员——OC中简单单列模式的实现

2015-11-12 22:02 525 查看
-----------android培训java培训、java学习型技术博客、期待与您交流!-----------
OC中简单单列模式的实现

一、单例模式的概念

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

二、使用场景

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

三、单例模式设计要点

1、某个类只有一个实例
2、必须自行创建这个对象
3、必须自行向整个系统提供这个实例
4、为保证实例的唯一性,必须将
-(id)copyWithZone:(NSZone *)zone;
+(id)callocWithZone:(NSZone *)zone;

-(id)retain
-(NSUInteger)retainCount
-(oneway void) release
-(void)autorelease 
这些方法进行重写覆盖
5、这个方法必须是一个静态类

四、在OC中实现单例模式

1、最简单的单例模式 

#import <Foundation/Fooundation.h>
//定义一个全局变量,static 是为了让对象这次使用的值继续保持下次也可以使用
 static  Tools *instances = nil;
// 创建一个Tools类
@interface Tools: NSObject
@property (nonatomic,  assign) int num;
@property (nonatomic, copy ) NSString *txt;
// 单例的接入点方法,必须提供一个接入点(一个方法)
+(instancetype) shareInstances; 
@end
// 类的实现
@implementation Tools
//单例的计入点方法
+(instancetype) shareInstances{
// 目的:保证对象唯一
if ( instances == nil){
//如果第一次(nil)使用   创建一个对象
instances = [ [ Tools alloc ]  init ];
return instacnes;
}
return instances;//  如果不为空则说明该对象已经创建完成,

4000
}
@end

//创建一个Person类
@interface Person: NSObject
-(void)run;
@end
@implementation Person
-(void)run{
// 创建一个单例对象   调用类方法,不能用alloc init 会创建一个新的
Tools *st = [ Tools  shareInstaces ];
//调用set方法设定单例对象属性值
st.num = 100;
st.txt = @"这是单例模式"
}
@end
// 创建一个Dog类
@interface Dog: NSObjecr
-(void)run;
@end
@implementation Dog
-(void)run{
//创建一个单例模式对象,调用类方法
Tools *st = [Tools shareInstances];
NSLog(@"st.num = %d, st.txt = %d", st.num,  st.txt
);
}

@end

//主函数中的代码
int main(){
@autoreleasepool{
Person *p = [Person new];
[p run];
Dog *d = [Dog new];
[d run];
//在Person中设置的数据在Dog类中可以使用,跨越了一层,实现了值传递
}
return 0;
}
如果要实现 即使使用alloc init 也不会产生行的方法需要重写alloc方法

2、复杂的单例模式实现

代码如下

#import <Foundation/Fooundation.h>

//定义一个全局变量,static 是为了让对象这次使用的值继续保持下次也可以使用

 static  Tools *instances = nil;

// 创建一个类

@interface Tools: NSObject <NSCopying> //遵守NSCopying 协议

@property (nonatomic,  assign) int num;

@property (nonatomic, copy ) NSString *txt;

// 单例的类声明,必须提供一个接入点(一个方法)

+(instancetype) shareInstances; 

@end

// 类的实现

@implementation Tools

-(id)copyWithZone:(NSZone *)zone{// 有copy需要遵守NSCopying协议
return self;
}
+(id)callocWithZone:(NSZone *)zone{
@synchronized(self) {//线程保护
if(instances == nil ){
//如果第一次的话 调用父类的alloc
instacnes =[super allocWithZone : zone ];
return instances;  // 如果第一次使用则 创建对象并返回
}
}
return instances;// 如果不是第一次 则返回对象 
}

-(id)retain{  
return self;
}
-(NSUInteger)retainCount{
//引用计数  返回一个最大的数
return NSUIntegerMax;
}
-(oneway void) release{

}
-(void)autorelease{
return self;

//单例的计入点方法

+(instancetype) shareInstances{

// 目的:保证对象唯一

if ( instances == nil){

//如果第一次(nil)使用   创建一个对象

instances = [ [ Tools alloc ]  init ];

return instacnes;

}

return instances;//  如果不为空则说明该对象已经创建完成,

}

@end

//创建一个Person类

@interface Person: NSObject

-(void)run;

@end

@implementation Person

-(void)run{

// 创建一个单例对象   调用类方法,不能用alloc init 会创建一个新的

Tools *st = [ Tools  shareInstaces ];

//调用set方法设定单例对象属性值

st.num = 100;

st.txt = @"这是单例模式"

}

@end

// 创建一个Dog类

@interface Dog: NSObjecr

-(void)run;

@end

@implementation Dog

-(void)run{

//创建一个单例模式对象,调用类方法

Tools *st = [Tools shareInstances];

NSLog(@"st.num = %d, st.txt = %d", st.num,  st.txt );

}

@end

//主函数中的代码

int main(){

@autoreleasepool{

Person *p = [Person new];

[p run];

Dog *d = [Dog new];

[d run];

//在Person中设置的数据在Dog类中可以使用,跨越了一层,实现了值传递

}

return 0;

}

此时的单例模式可以在任何一个类中使用,无法通过release、autorelease释放掉,直到程序结束才销毁
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: