面试题答案
一键面试数据结构设计优化
- 选择轻量级数据结构:
- 对于存储和传输的数据,优先选择像
NSDictionary
和NSArray
这样的轻量级容器,避免使用过于复杂或重量级的自定义数据结构。例如,如果要传输用户信息,可直接使用NSDictionary
来存储用户的各个属性:
NSDictionary *userInfo = @{ @"name": @"John Doe", @"age": @25, @"email": @"johndoe@example.com" };
- 对于存储和传输的数据,优先选择像
- 减少嵌套层级:
- 尽量保持数据结构的扁平化,过多的嵌套会增加序列化和反序列化的复杂度和时间。例如,将多层嵌套的 JSON 数据结构简化。假设原本有如下复杂结构:
可以简化为:{ "user": { "info": { "name": "John Doe", "age": 25 }, "address": { "city": "New York", "street": "123 Main St" } } }
在 Objective - C 中,如果使用{ "name": "John Doe", "age": 25, "city": "New York", "street": "123 Main St" }
NSDictionary
来表示,对应代码如下:// 简化前 NSDictionary *nestedUserInfo = @{ @"user": @{ @"info": @{ @"name": @"John Doe", @"age": @25 }, @"address": @{ "city": @"New York", "street": @"123 Main St" } } }; // 简化后 NSDictionary *flatUserInfo = @{ @"name": @"John Doe", @"age": @25, @"city": @"New York", @"street": @"123 Main St" };
算法选择优化
-
使用高效的序列化库:
- 对于 JSON 序列化与反序列化,使用
NSJSONSerialization
,它是苹果官方提供的,性能相对较好。例如,将NSDictionary
序列化为 JSON 数据:
NSError *error; NSDictionary *dataToSerialize = @{ @"key1": @"value1", @"key2": @2 }; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dataToSerialize options:NSJSONWritingPrettyPrinted error:&error]; if (jsonData) { NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; NSLog(@"Serialized JSON: %@", jsonString); } else { NSLog(@"Serialization error: %@", error); }
反序列化时:
NSString *jsonString = @"{\"key1\":\"value1\",\"key2\":2}"; NSData *jsonDataToDeserialize = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *deserializedData = [NSJSONSerialization JSONObjectWithData:jsonDataToDeserialize options:NSJSONReadingMutableContainers error:&error]; if (deserializedData) { NSLog(@"Deserialized data: %@", deserializedData); } else { NSLog(@"Deserialization error: %@", error); }
- 对于 JSON 序列化与反序列化,使用
-
并行处理:
- 如果数据量非常大,可以考虑将数据分块处理,然后并行进行序列化或反序列化。例如,假设有一个非常大的
NSArray
要序列化,可以将其分成多个小的NSArray
,然后使用 Grand Central Dispatch(GCD)并行处理:
NSArray *largeArray = // 包含大量数据的数组; NSUInteger chunkSize = 1000; NSMutableArray *serializedChunks = [NSMutableArray array]; dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_group_t group = dispatch_group_create(); for (NSUInteger i = 0; i < largeArray.count; i += chunkSize) { NSRange range = NSMakeRange(i, MIN(chunkSize, largeArray.count - i)); NSArray *chunk = [largeArray subarrayWithRange:range]; dispatch_group_enter(group); dispatch_async(queue, ^{ NSError *error; NSData *chunkData = [NSJSONSerialization dataWithJSONObject:chunk options:NSJSONWritingPrettyPrinted error:&error]; if (chunkData) { [serializedChunks addObject:chunkData]; } else { NSLog(@"Serialization error in chunk: %@", error); } dispatch_group_leave(group); }); } dispatch_group_wait(group, DISPATCH_TIME_FOREVER); // 合并所有序列化后的块数据 NSMutableData *finalSerializedData = [NSMutableData data]; for (NSData *chunkData in serializedChunks) { [finalSerializedData appendData:chunkData]; }
反序列化时类似,先分块反序列化,再合并数据。
- 如果数据量非常大,可以考虑将数据分块处理,然后并行进行序列化或反序列化。例如,假设有一个非常大的
-
增量式处理:
- 对于一些可以增量式生成或解析的数据,使用相关技术。例如,在处理 XML 数据时,可以使用
NSXMLParser
进行增量式解析,避免一次性加载整个 XML 文档。假设要解析一个大的 XML 文件,示例代码如下:
NSURL *xmlURL = [NSURL fileURLWithPath:@"largeFile.xml"]; NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL]; // 设置解析代理 parser.delegate = self; [parser parse]; // 实现代理方法,例如开始标签处理 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict { // 处理开始标签逻辑 } // 结束标签处理 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { // 处理结束标签逻辑 } // 字符数据处理 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { // 处理字符数据逻辑 }
- 对于一些可以增量式生成或解析的数据,使用相关技术。例如,在处理 XML 数据时,可以使用