iOS利用多线程实现单例

一、单例模式的简介:

单例(也可写作"单粒")模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。例如管理类,引擎类,也可以通过单例来实现传值。UIApplication、NSUserDefaults等都是IOS中的系统单例。

二、单例模式的作用:

  • 保证一个类在整个程序运行中只有一个实例,且易于外界访问控制实例个数,节省资源.
  • 直白的讲:就是无论你创建多少个对象,但他始终是一个
  • 举个例子 我创建了一个A类 并实现单例 那么我在VC1,VC2,VC3,VC4等控制器里[[A alloc] init] 都是创建的同一个对象

三、单例模式的实现

创建一个类 取名Person
Person.h文件中:
#import@interface XMGPerson : NSObject
+(instancetype)sharedPerson;
@end

Person.m文件中

#import "XMGPerson.h"@interface XMGPerson()@end

@implementation XMGPerson

static XMGPerson *_person;

+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    _person = [super allocWithZone:zone];
    });
    return _person;
}
+ (instancetype)sharedPerson
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    _person = [[self alloc] init];
    });
    return _person;
}
- (id)copyWithZone:(NSZone *)zone
{
    return _person;
}
@end

现在你再创建这个类只会有一个内存地址,并且里面的copyWithZone方法还不会影响使用copy的使用.(如果copyWithZone打不出来,请引入代理)

四、单例模式的解析测试:

1.创建一个类test(只是创建一个,不需要在里面写任何东西)
2.在viewController.m里面调用创建初始化并打印

test *test1 = [[test alloc] init];
test *test2 = [[test alloc] init];
test *test3 = [[test alloc] init];
test *test4 = [[test alloc] init];
NSLog(@"%p----%p----%p----%p",test1,test2,test3,test4);

3.注意看打印地址 会发现地址都不一样 说明每个实例都开辟了一处内存空间
4.为了对比我们再次调用上面创建的单例类Person 同样打印地址

Person *person2 = [[Person alloc] init];
Person *person3 = [[Person alloc] init];
Person *person4 = [[Person alloc] init];
NSLog(@"%p %p %p %p", person1, person2, person3, person4);

5.确定对比结果会发现使用单例内存地址只有一个,也就是说你每次调用的是相同的实例.

如果大家在工程里用的很多,觉得麻烦就把它定义成宏吧,长得差不多,抽取一下可以节省很多代码.

搞定了,单例简单不要想复杂了,如有失误,希望大家留言指正.

你可能感兴趣的:(iOS利用多线程实现单例)