面试题答案
一键面试数据获取层面
- Objective-C:
- 当使用Foundation框架的对象时,比如从网络请求或本地存储读取数据返回对象类型时,使用
nil
判断。例如,NSString *str = [self fetchStringData]; if (str == nil) { // 处理空值情况 }
。对于类对象指针,Class cls = [self fetchClass]; if (cls == Nil) { // 处理空类对象情况 }
。 - 当涉及Core Foundation等C语言相关框架获取指针时,使用
NULL
判断。如CFStringRef cfStr = [self fetchCFString]; if (cfStr == NULL) { // 处理空CFString指针情况 }
。
- 当使用Foundation框架的对象时,比如从网络请求或本地存储读取数据返回对象类型时,使用
- Swift:使用可选类型(Optional)。例如,
let data: String? = fetchStringData() if data == nil { // 处理空值情况 }
。对于可能返回空的类实例,也是如此,如let viewController: MyViewController? = instantiateViewController() if viewController == nil { // 处理空视图控制器情况 }
。
数据存储层面
- Objective-C:
- 不能直接将
nil
存入集合(如NSArray
、NSDictionary
),需使用NSNull
来表示空值。例如,NSMutableDictionary *dict = [NSMutableDictionary dictionary]; NSString *value = nil; [dict setObject:value ? value : [NSNull null] forKey:@"key"];
。 - 对于Core Data存储,要确保实体属性的设置符合其类型要求,当属性值可能为空时,按其类型进行空值处理。例如,如果是可空字符串属性,
NSManagedObject *obj = [NSEntityDescription insertNewObjectForEntityForName:@"MyEntity" inManagedObjectContext:context]; obj.name = value ? value : @"";
- 不能直接将
- Swift:
- 在将数据存入集合类型(如
Array
、Dictionary
)时,同样不能直接存nil
。对于字典,如果值可能为空,如var dict: [String: String?] = [:]; let value: String? = nil; dict["key"] = value ?? ""
。 - 在使用Core Data时,类似Objective - C,确保实体属性正确处理空值。如
let request: NSFetchRequest<MyEntity> = MyEntity.fetchRequest() let result = try? context.fetch(request) if let entity = result?.first { entity.name = value ?? "" }
- 在将数据存入集合类型(如
视图展示层面
- Objective-C:
- 在设置视图的文本等属性时,先判断值是否为
nil
。例如,UILabel *label = [[UILabel alloc] init]; NSString *text = [self fetchText]; label.text = text ? text : @"";
。 - 如果视图是通过数据驱动创建,在数据源为空(
nil
)时,要进行适当处理,如隐藏视图或显示占位信息。如UITableView *tableView = [[UITableView alloc] init]; NSArray *data = [self fetchData]; if (data == nil) { tableView.hidden = YES; } else { tableView.hidden = NO; // 配置表格视图数据源 }
- 在设置视图的文本等属性时,先判断值是否为
- Swift:
- 对于视图的属性设置,如
let label = UILabel() let text: String? = fetchText() label.text = text ?? ""
。 - 在基于数据驱动的视图创建中,当数据源为空(
nil
)时,处理方式与Objective - C类似。如let tableView = UITableView() let data: [MyData]? = fetchData() if data == nil { tableView.isHidden = true } else { tableView.isHidden = false // 配置表格视图数据源 }
- 对于视图的属性设置,如