iOS 单例模式

单例模式只能修改无法释放,直到程序结束

单例模式的创建:

1.单例模式一旦创建,是永远存在于内存中.所以需要创建一个全局变量

Static MySingletonClass *sharedSingletonObj=nil;

2.单例模式,一定有一个构造方法直接忽略跳过实例对象的生成过程.据此看来”类方法”最合适不过了

+(MySingletonClass*)sharedSingleton{

@synchronized(self){

//创建

If(sharedSingletonObj==nil){

sharedSingletonObj=[[super allocWithZone:NULL]init];

}

else{

NSLog(@”单例对象已经存在!”);

}

}

return sharedSingletonObj;

}

3.对sharedSingletonObj执行了copy,我们需要重写copy方法

-(id)copyWithZone:(NSZone *)zone{

return self;

}

4.对sharedSingletonObj执行了retain,我们需要重写retain方法

-(id)retain{

return self;

}

5.继续对releaseautorelease方法进行重写

-(void)release{

 

}

-(id)autorelease{

return self;

}

6.我们需要实现NSObject里面,关于引用计数API的重写以避免因为引用计数为0导致dealloc的触发

-(NSUInteger)retainCount{

//是一个无限大的int,避免了系统自动触发单例的dealloc

//也可以明确告知调用者,此为单例对象

return NSUIntegerMax;

 

}

7.最后,需要通过类方法创建对象转而调用alloc创建,则每次会分配新内存且引用计数+1,显然alloc方法势必也需要重写

+(id)allocWithZone:(NSZone *)zone{

//直接套用sharedsingleton,retain符合alloc管理

//使类方法返回的对象的引用的计数+1,此处retain根据上面的重写内容,不作任何事情

return [[MySingletonClass sharedSingleton]retain];

}

以下是单例模式的全部代码实现

Static MySingletonClass *sharedSingletonObj=nil;

+(MySingletonClass*)sharedSingleton{

@synchronized(self){

//创建

If(sharedSingletonObj==nil){

sharedSingletonObj=[[super allocWithZone:NULL]init];

}

else{

NSLog(@”单例对象已经存在!”);

}

}

return sharedSingletonObj;

}

+(id)allocWithZone:(NSZone *)zone{

return [[MySingletonClass sharedSingleton] retain];

}

-(id)copyWithZone:(NSZone *)zone{

return self;

}

-(id)retain{

return self;

}

-(void)release{

 

}

-(id)autorelease{

return self;

}

-(NSUInteger)retainCount{

//是一个无限大的int,避免了系统自动触发单例的dealloc

//也可以明确告知调用者,此为单例对象

return NSUIntegerMax;

 

}

 

 

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值