这篇文章主要和大家谈一谈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 studio按钮监听的5种方法实例详解 2023-01-12
- Android多返回栈技术 2023-04-15
- iOS开发教程之XLForm的基本使用方法 2023-05-01
- Android开发使用RecyclerView添加点击事件实例详解 2023-06-15
- Android中的webview监听每次URL变化实例 2023-01-23
- IOS 播放系统提示音使用总结(AudioToolbox) 2023-03-01
- IOS应用内跳转系统设置相关界面的方法 2022-11-20
- 解决Android Studio突然不显示logcat日志的问题 2023-02-04
- Flutter绘图组件之CustomPaint使用详解 2023-05-12
- Flutter手势密码的实现示例(附demo) 2023-04-11
