源码0501-10-掌握-单粒模式
单粒设计模式
单粒宏定义
// ViewController.m // 10-掌握-单粒模式 #import "ViewController.h" #import "XMGPerson.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // XMGPerson *person1 = [[XMGPerson alloc] init]; // person1.name = @"jack"; // // XMGPerson *person2 = [[XMGPerson alloc] init]; // XMGPerson *person3 = [[XMGPerson alloc] init]; // XMGPerson *person4 = [[XMGPerson alloc] init]; // NSLog(@"%p %p %p %p", person1, person2, person3, person4); // NSLog(@"%@", person3.name); // NSLog(@"%@ %@", [XMGPerson sharedPerson], [XMGPerson sharedPerson]);//两个类地址一样; } @end
// XMGPerson.h // 10-掌握-单粒模式 #import <Foundation/Foundation.h> @interface XMGPerson : NSObject /** 名字 */ @property (nonatomic, strong) NSString *name; + (instancetype)sharedPerson; @end
// XMGPerson.m // 10-掌握-单粒模式 #import "XMGPerson.h" @interface XMGPerson() <NSCopying> @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];//self alloc 会自动掉用上面的allocWithZone方法 }); return _person; } - (id)copyWithZone:(NSZone *)zone { return _person; } @end
// XMGPerson.h // 10-掌握-单粒模式 #import <Foundation/Foundation.h> @interface XMGPerson : NSObject /** 名字 */ @property (nonatomic, strong) NSString *name; + (instancetype)sharedPerson; @end
// XMGPerson.m // 10-掌握-单粒模式 #import "XMGPerson.h" @interface XMGPerson() <NSCopying> @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
10-掌握-单粒模式
// ViewController.h // 10-掌握-单粒模式 #import <UIKit/UIKit.h> #import "XMGSingleton.h" @interface ViewController : UIViewController XMGSingletonH @end
// ViewController.m // 10-掌握-单粒模式 #import "ViewController.h" #import "XMGPerson.h" #import "XMGCar.h" @interface ViewController () @end @implementation ViewController XMGSingletonM - (void)viewDidLoad { [super viewDidLoad]; } @end
单粒宏的定义
// .h文件
#define XMGSingletonH + (instancetype)sharedInstance; //声明的地方
// .m文件
#define XMGSingletonM \ 这里的一行替代后面的一片
static id _instance; \
\
+ (instancetype)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [super allocWithZone:zone]; \
}); \
return _instance; \
} \
\
+ (instancetype)sharedInstance \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [[self alloc] init]; \
}); \
return _instance; \
} \
\
- (id)copyWithZone:(NSZone *)zone \
{ \
return _instace; \
}
// XMGCar.h // 10-掌握-单粒模式 #import <Foundation/Foundation.h> #import "XMGSingleton.h" @interface XMGCar : NSObject XMGSingletonH @end
// XMGCar.m // 10-掌握-单粒模式 #import "XMGCar.h" @interface XMGCar() @end @implementation XMGCar XMGSingletonM @end
带参数的宏定义
// .h文件 #define XMGSingletonH(name) + (instancetype)shared##name; // .m文件 #define XMGSingletonM(name) \ static id _instance; \ \ + (instancetype)allocWithZone:(struct _NSZone *)zone \ { \ static dispatch_once_t onceToken; \ dispatch_once(&onceToken, ^{ \ _instance = [super allocWithZone:zone]; \ }); \ return _instance; \ } \ \ + (instancetype)shared##name \ { \ static dispatch_once_t onceToken; \ dispatch_once(&onceToken, ^{ \ _instance = [[self alloc] init]; \ }); \ return _instance; \ } \ \ - (id)copyWithZone:(NSZone *)zone \ { \ return _instance; \ }
带参数的宏的使用
// XMGPerson.h // 10-掌握-单粒模式 #import <Foundation/Foundation.h> #import "XMGSingleton.h" @interface XMGPerson : NSObject /** 名字 */ @property (nonatomic, strong) NSString *name; XMGSingletonH(Person) @end
// XMGPerson.m
// 10-掌握-单粒模式 #import "XMGPerson.h" @interface XMGPerson() @end @implementation XMGPerson XMGSingletonM(Person) @end
// ViewController.m // 10-掌握-单粒模式 #import "ViewController.h" #import "XMGPerson.h" #import "XMGCar.h" @interface ViewController () @end @implementation ViewController XMGSingletonM(ViewController) 这之后 viewController就是一个单粒了 - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"%@ %@", [ViewController sharedViewController], [[ViewController alloc] init]); NSLog(@"%@ %@", [XMGCar sharedCar], [[XMGCar alloc] init]); // XMGPerson *person1 = [[XMGPerson alloc] init]; // person1.name = @"jack"; // // XMGPerson *person2 = [[XMGPerson alloc] init]; // XMGPerson *person3 = [[XMGPerson alloc] init]; // XMGPerson *person4 = [[XMGPerson alloc] init]; // NSLog(@"%p %p %p %p", person1, person2, person3, person4); // NSLog(@"%@", person3.name); // NSLog(@"%@ %@", [XMGPerson sharedPerson], [XMGPerson sharedPerson]); } @end
13-掌握-单粒模式(非GCD)
// ViewController.m // 10-掌握-单粒模式 #import "ViewController.h" #import "XMGPerson.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // XMGPerson *person1 = [[XMGPerson alloc] init]; // person1.name = @"jack"; // // XMGPerson *person2 = [[XMGPerson alloc] init]; // XMGPerson *person3 = [[XMGPerson alloc] init]; // XMGPerson *person4 = [[XMGPerson alloc] init]; // NSLog(@"%p %p %p %p", person1, person2, person3, person4); // NSLog(@"%@", person3.name); NSLog(@"%@ %@", [XMGPerson sharedInstance], [[XMGPerson alloc] init]); dispatch_async(dispatch_get_global_queue(0, 0), ^{ //不加锁会存在同时掉用有安全问题; [[XMGPerson alloc] init]; }); dispatch_async(dispatch_get_global_queue(0, 0), ^{ [[XMGPerson alloc] init]; }); dispatch_async(dispatch_get_global_queue(0, 0), ^{ [[XMGPerson alloc] init]; }); } @end
// XMGPerson.h // 10-掌握-单粒模式 #import <Foundation/Foundation.h> @interface XMGPerson : NSObject + (instancetype)sharedInstance; @end
// XMGPerson.m // 10-掌握-单粒模式 #import "XMGPerson.h" @interface XMGPerson() @end @implementation XMGPerson static id _instance; + (instancetype)allocWithZone:(struct _NSZone *)zone { @synchronized(self) { //加锁防撞 if (_instance == nil) { _instance = [super allocWithZone:zone]; } } return _instance; } + (instancetype)sharedInstance { @synchronized(self) { if (_instance == nil) { _instance = [[self alloc] init]; } } return _instance; } - (id)copyWithZone:(NSZone *)zone { return _instance; } @end
本人无商业用途,仅仅是学习做个笔记,特别鸣谢小马哥,学习了IOS,另日语学习内容有需要文本和音频请关注公众号:riyuxuexishuji