面试题答案
一键面试1. 实现单例模式的代码结构
在Objective-C中,实现单例模式通常使用GCD
(Grand Central Dispatch)来确保线程安全。以下是标准的单例实现代码:
#import <Foundation/Foundation.h>
@interface Singleton : NSObject
@property (nonatomic, strong, readonly) NSString *sharedValue;
+ (instancetype)sharedInstance;
@end
@implementation Singleton
static Singleton *sharedInstance = nil;
+ (instancetype)sharedInstance {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
- (instancetype)init {
if (self = [super init]) {
_sharedValue = @"Initial value";
}
return self;
}
@end
- 关键字:
static
:用于声明静态变量。sharedInstance
声明为静态变量,确保在整个程序生命周期内只有一个实例。onceToken
也是静态变量,dispatch_once
会根据这个变量来确保代码块只执行一次。dispatch_once
:这是GCD提供的函数,保证其代码块中的代码在整个程序生命周期内只执行一次,从而实现单例的创建。
- 线程安全:
dispatch_once
函数是线程安全的。无论有多少个线程同时调用sharedInstance
方法,dispatch_once
都能保证sharedInstance
只被初始化一次。
2. iOS项目场景中的应用
- 应用场景:
- 网络请求管理器:在一个iOS应用中,经常需要进行网络请求。可以创建一个网络请求单例,负责管理所有的网络请求任务、配置请求参数、处理请求结果等。因为网络请求的配置(如Base URL、请求头)通常在整个应用中是统一的,使用单例模式可以确保在不同的视图控制器或模块中使用相同的配置,避免重复配置,同时方便管理和维护。
- 用户信息管理:应用中可能需要在多个地方获取和修改用户的登录信息、偏好设置等。通过单例模式创建一个用户信息管理器,各个模块都可以方便地访问和修改用户信息,并且保证数据的一致性。
- 日志记录:应用可能需要记录各种日志信息,如用户操作、错误信息等。创建一个日志记录单例,所有模块都可以向这个单例对象发送日志记录请求,单例对象可以统一管理日志的记录方式(如写入文件、上传服务器),避免在不同地方重复实现日志记录逻辑。
- 选择单例模式的原因:
- 全局访问:单例模式提供了一个全局访问点,使得应用的各个部分都可以方便地访问特定的资源或功能。
- 资源管理:对于一些需要在整个应用中共享的资源(如网络连接、数据库连接),使用单例模式可以确保资源的正确管理和复用,避免资源的浪费和冲突。
- 数据一致性:在涉及到全局数据(如用户信息)时,单例模式可以保证在不同模块中对数据的访问和修改都是基于同一个实例,从而保证数据的一致性。