什么是单例模式
// static id sharedMyManager; //注意这里必须在类的.m文件中定义一个全局变量
// //sharedXXX defaultXXX currentXXX //默认的定义单例模式的命名方式
//
// +(id)sharedMyManageer{
// if (sharedMyManager==nil) { //此处判断是确保实例的唯一性
//
// sharedMyManager=[[self alloc]init];
//
// }
// return sharedMyManager; //第一次后每次通过这个类方法创建的对象都是唯一的实例
// }
//
说到这里可能大家都了解的差不多了。下面我写了一个小例子来作为最经典简单的单例模式。
在arc模式下:
定义了一个dog类。
//
// Dog.h
// 笔记
//
// Created by 肖俊全 on 15/3/2.
// Copyright (c) 2015年 肖俊全. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Dog : NSObject
@property (nonatomic ,assign) NSString * name;
+(id)sharedMyDog;
@end
//
// Dog.m
// 笔记
//
// Created by 肖俊全 on 15/3/2.
// Copyright (c) 2015年 肖俊全. All rights reserved.
//
#import "Dog.h"
static Dog *dog; //必须创建一个全局对象
@implementation Dog
+(id)sharedMyDog{
@synchronized(self){ //这段代码让线程进入atomic状态,如果多个线程进入这段代码,这段代码只能一个线程执行
if (dog == nil) {
//第一次进入,存于全局变量中
dog=[[self alloc]init];
}
}
return dog;
}
- (instancetype)init
{
self = [super init];
if (self) {
self.name=@"wangwang";
}
return self;
}
-(NSString *)description{
NSString * name = [NSString stringWithFormat:@"%@",self.name];
return name;
}
@end
在主函数中,我们对每个对象进行了地址的打印。,,并且打印出每个对象的dog name属性。
//
// main.m
// 笔记
//
// Created by 肖俊全 on 15/3/2.
// Copyright (c) 2015年 肖俊全. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Dog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
Dog * d1 =[Dog sharedMyDog];
Dog * d2= [Dog sharedMyDog];
NSLog(@"d1==%p,d2==%p",d1,d2);
NSLog(@"d1的名字是%@,d2的名字是%@",d1,d2);
Dog *d3=[Dog sharedMyDog];
d2.name=@"miaomiao";
NSLog(@"d1==%p,d2==%p,d3=%p",d1,d2,d3);
NSLog(@"d1的名字是%@,d2的名字是%@,d3的名字是%@",d1,d2,d3);
}
return 0;
}
运行结果如下:
2015-03-03 15:48:35.949 单例笔记[1514:110062] d1==0x100406940,d2==0x100406940
2015-03-03 15:48:35.950 单例笔记[1514:110062] d1的名字是wangwang,d2的名字是wangwang
2015-03-03 15:48:35.950 单例笔记[1514:110062] d1==0x100406940,d2==0x100406940,d3=0x100406940
2015-03-03 15:48:35.951 单例笔记[1514:110062] d1的名字是miaomiao,d2的名字是miaomiao,d3的名字是miaomiao
Program ended with exit code: 0
在我们改改了d2对象的name属性的同时,d1,d3的name属性也随之改变。因为其内存地址是一样的。在此实现了单例模式。
注意我们在真正需要写或用单例时,千万不要像平时这样创建----Dog *dog=[[Dog alloc]init];
注意:所谓单例,即我们自己创建一个单例类,该类只能生成唯一的对象,即用