面试题答案
一键面试1. 数据传递的安全要点
在Objective-C中使用Block与多线程结合传递数据时,需要注意以下几点以确保安全:
- 避免数据竞争:多个线程同时访问和修改同一数据可能导致数据不一致,应使用锁、队列等机制来同步访问。
- 内存管理:确保传递的数据在不同线程间有正确的生命周期管理,防止悬空指针或内存泄漏。
2. 示例代码
#import <Foundation/Foundation.h>
@interface DataTransferManager : NSObject
@property (nonatomic, strong) NSMutableArray *sharedData;
@property (nonatomic, strong) dispatch_queue_t dataQueue;
- (void)transferData;
@end
@implementation DataTransferManager
- (instancetype)init {
self = [super init];
if (self) {
_sharedData = [NSMutableArray array];
_dataQueue = dispatch_queue_create("com.example.dataQueue", DISPATCH_QUEUE_SERIAL);
}
return self;
}
- (void)transferData {
// 在后台线程生成数据
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSArray *newData = @[@"item1", @"item2", @"item3"];
// 将新数据添加到共享数据数组中,使用队列同步访问
dispatch_sync(self.dataQueue, ^{
[self.sharedData addObjectsFromArray:newData];
});
// 在主线程处理共享数据
dispatch_async(dispatch_get_main_queue(), ^{
dispatch_sync(self.dataQueue, ^{
for (NSString *item in self.sharedData) {
NSLog(@"Main thread: %@", item);
}
});
});
});
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
DataTransferManager *manager = [[DataTransferManager alloc] init];
[manager transferData];
// 防止程序提前退出
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:5]];
}
return 0;
}
在上述示例中:
DataTransferManager
类封装了共享数据sharedData
和一个串行队列dataQueue
。transferData
方法首先在后台线程生成新数据,然后使用dispatch_sync
在dataQueue
队列中安全地将新数据添加到sharedData
。- 之后,在主线程中,再次使用
dispatch_sync
在dataQueue
队列中安全地遍历并处理sharedData
中的数据,以此确保数据在不同线程间传递的安全性。