这篇文章主要和大家谈一谈iOS中的单例模式,单例模式是一种常用的软件设计模式,想要深入了解iOS单例模式的朋友可以参考一下
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
1、书写步骤
1)、创建类方法,返回对象实例.以shared default current开头。
2)、创建一个全局变量用来保存对象的引用
3)、判断对象是否存在,若不存在,创建对象
2、具体单例模式的几种模式
第一种单例模式
//非线程安全写法
static UserHelper * helper = nil;
+ (UserHelper *)sharedUserHelper {
if (helper == nil) {
helper = [[UserHelper alloc] init];
}
return helper;
}
第二种单例模式
//线程安全写法1
static UserHelper * helper = nil;
+ (UserHelper *)sharedUserHelper {
@synchronized(self) {
if (helper == nil) {
helper = [[UserHelper alloc] init];
}
}
return helper;
}
第三种单例模式
+ (void)initialize {
if ([self class] == [UserHelper class]) {
helper = [[UserHelper alloc] init];
}
}
第四种单例模式
//线程安全写法3(苹果推荐,主要用这个)
static UserHelper * helper = nil;
+ (UserHelper *)sharedUserHelper {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
helper = [[UserHelper alloc] init];
});
return helper;
}
MRC全面实现单例写法(了解)
#import <Foundation/Foundation.h>
#import "UserHelper.h"
void func() {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"haha");
});
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
// [UserHelper logout];
if ([UserHelper isLogin]) {
UserHelper * helper = [UserHelper sharedUserHelper];
NSLog(@"username = %@ password = %@",helper.userName,helper.password);
} else {
char name[20];
char pwd[20];
NSLog(@"请输入用户名");
scanf("%s",name);
NSLog(@"请输入密码");
scanf("%s",pwd);
NSString * userName = [[NSString alloc] initWithUTF8String:name];
NSString * password = [[NSString alloc] initWithUTF8String:pwd];
if (userName && password) {
[UserHelper loginWithUserName:userName password:password];
UserHelper * helper = [UserHelper sharedUserHelper];
NSLog(@"username = %@ password = %@",helper.userName,helper.password);
}
}
// UserHelper * help1 = [UserHelper sharedUserHelper];
// help1.userName = @"dahuan";
// help1.password = @"123456";
// NSLog(@"%p",help1);
// NSLog(@"%@",help1.userName);
// NSLog(@"%@",help1.password);
//
//
// UserHelper * help2 = [UserHelper sharedUserHelper];
// help2.password = @"zxc";
// NSLog(@"%p",help2);
// NSLog(@"%@",help1.userName);
// NSLog(@"%@",help1.password);
}
return 0;
}
//class.h
#import <Foundation/Foundation.h>
@interface UserHelper : NSObject
//1、创建类方法,返回对象实例 shared default current
+ (UserHelper *)sharedUserHelper;
@property (nonatomic, copy) NSString * userName;
@property (nonatomic, copy) NSString * password;
+ (BOOL)isLogin;
+ (void)loginWithUserName:(NSString *)userName password:(NSString *)password;
+ (void)logout;
@end
// class.m
#import "UserHelper.h"
//2、创建一个全局变量
#define Path @"/Users/dahuan/Desktop/data"
static UserHelper * helper = nil;
@implementation UserHelper
//+ (void)initialize {
//
// if ([self class] == [UserHelper class]) {
// helper = [[UserHelper alloc] init];
// }
/
沃梦达教程
本文标题为:谈一谈iOS单例模式
猜你喜欢
- Android实现轮询的三种方式 2023-02-17
- Android MaterialButton使用实例详解(告别shape、selector) 2023-06-16
- 作为iOS开发,这道面试题你能答出来,说明你基础很OK! 2023-09-14
- Flutter实现底部和顶部导航栏 2022-08-31
- 最好用的ios数据恢复软件:PhoneRescue for Mac 2023-09-14
- Android studio实现动态背景页面 2023-05-23
- SurfaceView播放视频发送弹幕并实现滚动歌词 2023-01-02
- Android实现监听音量的变化 2023-03-30
- 详解flutter engine 那些没被释放的东西 2022-12-04
- iOS 对当前webView进行截屏的方法 2023-03-01