面试题答案
一键面试设计思路
- 分析各模块依赖:梳理每个模块所依赖的系统 API 及其最低支持版本。
- 分层架构:将项目分为多个层次,如业务逻辑层、数据访问层等,每个层次再细分模块。
- @available 应用:在调用系统 API 的地方,使用 @available 语法进行版本检查,根据不同系统版本执行不同逻辑。
项目架构图
graph TD;
A[应用层] --> B1[业务模块 1];
A --> B2[业务模块 2];
B1 --> C1[数据访问模块 1];
B2 --> C2[数据访问模块 2];
- 应用层:负责整体的用户交互和流程控制,调用业务模块功能。
- 业务模块:处理具体业务逻辑,可能调用数据访问模块获取数据。
- 数据访问模块:负责与底层数据存储交互,可能使用不同版本系统 API。
关键代码示例
假设在数据访问模块中获取设备唯一标识符,iOS 13 及以上有新的 API,之前版本有旧的方式。
#import <UIKit/UIKit.h>
@interface DataAccessModule : NSObject
- (NSString *)getDeviceIdentifier;
@end
@implementation DataAccessModule
- (NSString *)getDeviceIdentifier {
if (@available(iOS 13.0, *)) {
// 使用新 API 获取设备标识符
UIDevice *device = UIDevice.currentDevice;
return device.identifierForVendor.UUIDString;
} else {
// 使用旧 API 获取设备标识符(仅示例,实际可能需适配)
return [[[UIDevice currentDevice] identifierForVendor] UUIDString];
}
}
@end
在业务模块调用时无需关心具体版本实现:
#import "DataAccessModule.h"
@interface BusinessModule : NSObject
- (void)doSomething;
@end
@implementation BusinessModule
- (void)doSomething {
DataAccessModule *dataAccess = [[DataAccessModule alloc] init];
NSString *identifier = [dataAccess getDeviceIdentifier];
NSLog(@"Device Identifier: %@", identifier);
}
@end