MST

星途 面试题库

面试题:Objective-C中Block在多线程环境下如何传递数据

请描述在Objective-C中,当使用Block与多线程结合时,如何在不同线程间安全有效地传递数据,并给出一个简单示例代码。
26.9万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

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_syncdataQueue队列中安全地将新数据添加到sharedData
  • 之后,在主线程中,再次使用dispatch_syncdataQueue队列中安全地遍历并处理sharedData中的数据,以此确保数据在不同线程间传递的安全性。