OC学习笔记之单例模式

本文详细介绍了单例模式的概念、应用场景、特点,并通过代码示例展示了如何在Objective-C中实现单例模式。此外,文章还探讨了单例模式在实际开发中的应用,以及与其他设计模式的整合。

OC学习笔记之单例模式


什么是单例模式

类A有一个唯一对象,并且该类中提供了一个类方法,该方法类似于一个共享接口,可以使其他类通过调用该方法来共享类A中的这个唯一的对象。

什么情况下使用单例模式

(1)该类只有一个实例对象,并且提供了一个共享访问点
(2)这个实例只能通过子类扩展,并且扩展的内容不会影响到客户端代码

单例模式的特点

(1)该类只有一个对象(指的是在堆区只有一个对象空间),一次复制,全局使用
(2)这个唯一的实例,必须由该类自行创建
(3)必须提供共享接口(类方法)
(4)为了保证实例的唯一性,必须重写6个方法:
   1>copy方法:-(id)copyWithZone(NSZone *)zone;
   2>alloc方法:+(id)allocWithZone(NSZone *)zone;
   3>retain方法:-(id)retain;
   4>retainCount方法:-(NSUInteger)retainCount;
   5>release方法:-(oneway void)release;
   6>autorelease方法:-(id)autorelease;
(5)这个共享接口必须是一个静态类

代码实现

单例类.h文件

#import <Foundation/Foundation.h>

@interface SingletonPerson :NSObject<NSCopying>//遵守协议,重写方法
@property(nonatomic,assign)int age;
@property(nonatomic,copy)NSString *name;

//单例的类要提供一个类方法,即共享访问接口
+(instancetype)SingleShare;
@end

单例类.m文件

#import "SingletonPerson.h"
static SingletonPerson *per = nil;

@implementation SingletonPerson
+(instancetype)SingleShare{
    if(per == nil){
        per = [[SingletonPerson alloc] init];
        return per;
    }
    return per;
}
//重写copy方法
-(id)copyWithZone:(NSZone *)zone{
    return self;
}
//重写alloc方法
+(id)allocWithZone:(NSZone *)zone{
    if(per == nil){//如果per为空,那么调用父类的alloc方法开辟空间
        per = [super allocWithZone:zone];
        return per;
    }
    return per;
}
//重写retain方法
-(id)retain{
    return self;
}
//重写retaincount方法
-(NSUInteger)retainCount{
    return NSUIntegerMax;
}
//重写release方法
-(oneway void)release{

}
//重写autorelease方法
-(id)autorelease{
    return self;
}
@end

其他类(Person).m文件

#import "Person.h"
#import "SingletonPerson.h"
@implementation Person
-(void)run{
    //创建单例对象
    SingletonPerson *per = [SingletonPerson SingleShare];
    //调用set方法,设置属性值。
    per.name = @"zhuhoulin";
    per.age = 25;
    NSLog(@"%@  %d",per.name,per.age);
}
@end

其他类(Dog).m文件

#import "Dog.h"
#import "SingletonPerson.h"
@implementation Dog
-(void)run{
    SingletonPerson *dog = [SingletonPerson SingleShare];
    NSLog(@"%@   %d",dog.name,dog.age);
}
@end

main.m文件

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {
        Person *person = [[Person alloc]init];
        [person run];
        Dog *dog = [[Dog alloc]init];
        [dog run];
        // insert code here...
        NSLog(@"Hello, World!");

    }
    return 0;
}

结果

2015-08-07 11:51:55.403 OC笔记之单例设计模式[436:303] zhuhoulin  25
2015-08-07 11:51:55.405 OC笔记之单例设计模式[436:303] zhuhoulin   25
2015-08-07 11:51:55.405 OC笔记之单例设计模式[436:303] Hello, World!
Program ended with exit code: 0
  • 加粗 Ctrl + B
  • 斜体 Ctrl + I
  • 引用 Ctrl + Q
  • 插入链接 Ctrl + L
  • 插入代码 Ctrl + K
  • 插入图片 Ctrl + G
  • 提升标题 Ctrl + H
  • 有序列表 Ctrl + O
  • 无序列表 Ctrl + U
  • 横线 Ctrl + R
  • 撤销 Ctrl + Z
  • 重做 Ctrl + Y

Markdown及扩展

Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面。 —— [ 维基百科 ]

使用简单的符号标识不同的标题,将某些文字标记为粗体或者斜体,创建一个链接等,详细语法参考帮助?。

本编辑器支持 Markdown Extra ,  扩展了很多好用的功能。具体请参考Github.

表格

Markdown Extra 表格语法:

项目价格
Computer$1600
Phone$12
Pipe$1

可以使用冒号来定义对齐方式:

项目价格数量
Computer1600 元5
Phone12 元12
Pipe1 元234

定义列表

Markdown Extra 定义列表语法: 项目1 项目2
定义 A
定义 B
项目3
定义 C

定义 D

定义D内容

代码块

代码块语法遵循标准markdown代码,例如:

@requires_authorization
def somefunc(param1='', param2=0):
    '''A docstring'''
    if param1 > param2: # interesting
        print 'Greater'
    return (param2 - param1 + 1) or None
class SomeClass:
    pass
>>> message = '''interpreter
... prompt'''

脚注

生成一个脚注1.

目录

[TOC]来生成目录:

数学公式

使用MathJax渲染LaTex 数学公式,详见math.stackexchange.com.

  • 行内公式,数学公式为: Γ(n)=(n1)!n
  • 块级公式:

x=b±b24ac2a

更多LaTex语法请参考 这儿.

UML 图:

可以渲染序列图:

Created with Raphaël 2.1.0 张三 张三 李四 李四 嘿,小四儿, 写博客了没? 李四愣了一下,说: 忙得吐血,哪有时间写。

或者流程图:

Created with Raphaël 2.1.0 开始 我的操作 确认? 结束 yes no
  • 关于 序列图 语法,参考 这儿,
  • 关于 流程图 语法,参考 这儿.

离线写博客

即使用户在没有网络的情况下,也可以通过本编辑器离线写博客(直接在曾经使用过的浏览器中输入write.blog.youkuaiyun.com/mdeditor即可。Markdown编辑器使用浏览器离线存储将内容保存在本地。

用户写博客的过程中,内容实时保存在浏览器缓存中,在用户关闭浏览器或者其它异常情况下,内容不会丢失。用户再次打开浏览器时,会显示上次用户正在编辑的没有发表的内容。

博客发表后,本地缓存将被删除。 

用户可以选择 把正在写的博客保存到服务器草稿箱,即使换浏览器或者清除缓存,内容也不会丢失。

注意:虽然浏览器存储大部分时候都比较可靠,但为了您的数据安全,在联网后,请务必及时发表或者保存到服务器草稿箱

浏览器兼容

  1. 目前,本编辑器对Chrome浏览器支持最为完整。建议大家使用较新版本的Chrome。
  2. IE9以下不支持
  3. IE9,10,11存在以下问题
    1. 不支持离线功能
    2. IE9不支持文件导入导出
    3. IE10不支持拖拽文件导入


  1. 这里是 脚注内容.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值