——黑马程序员——OC中简单单列模式的实现
2015-11-12 22:02
525 查看
-----------android培训、java培训、java学习型技术博客、期待与您交流!-----------
OC中简单单列模式的实现
2、这个唯一的实例只能通过子类化进行扩展,而且扩展对象不会破坏客户端代码
2、必须自行创建这个对象
3、必须自行向整个系统提供这个实例
4、为保证实例的唯一性,必须将
-(id)copyWithZone:(NSZone *)zone;
+(id)callocWithZone:(NSZone *)zone;
-(id)retain
-(NSUInteger)retainCount
-(oneway void) release
-(void)autorelease
这些方法进行重写覆盖
5、这个方法必须是一个静态类
//定义一个全局变量,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方法
#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释放掉,直到程序结束才销毁
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释放掉,直到程序结束才销毁
相关文章推荐
- JAVA面试题
- 软件开发工程师面试题目
- 程序员面试经典题--归并排序
- 黑马程序员——正则表达式
- 转载:java面试题(二)
- java程序员第一课 html 网页标签
- 转载:java面试题(一)
- SDCC 2015讲师专访精彩集锦:程序员界“香饽饽”、大神级人物都在!
- 嵌入式软件工程师面试必须知道的问题(不定时更新)
- iOS面试3
- 黑马程序员--Java基础--集合和集合中的泛型
- iOS面试2
- 拒绝过劳死,码农们如何养生?
- 黑马程序员--反射
- SQL面试题记录
- 程序员必备——软件工程
- Sql经典面试题三
- Sql经典面试题二
- SQL经典面试题一
- <仅是自己做笔记。。。系列x>所有系列题目都来自v_JULY_v前辈的:精选微软等公司经典的算法面试100题