gpt4 book ai didi

ios - ARC 的多线程自动释放问题?

转载 作者:行者123 更新时间:2023-12-02 03:02:14 27 4
gpt4 key购买 nike

服务类别具有在串行队列中设置的非原子属性。

@interface Service
@property (strong, nonatomic) NSDictionary *status;
@property (nonatomic) dispatch_queue_t queue;
...
@end

- (void)update:(NSDicationary *)paramDict {
dispatch_async(self.queue, ^{
....
self.status = updateDict;
}
}


- (void)someMethod {
NSDictionary *status = self.status;
}

objc_autorelease + 6 处调用 getter 时,应用程序崩溃了,这似乎是一次运行时/Clang/llvm 调用。

崩溃日志还显示 status 属性刚刚在 queue 线程上设置。

它是否因为访问器缺乏原子性而崩溃?如果是,getter 如何以及为何未能保留实例?自动释放池是否在合成的非原子 setter 内被耗尽?

我应该实现 getter/setter 方法,并使用队列/互斥锁来保护它吗?

最佳答案

虽然atomic可以解决多线程代码中基本数据类型的一些完整性问题,但通常不足以实现线程安全。线程安全通常是通过明智地使用锁或队列来实现的。请参阅Synchronization 线程编程指南部分。或者参见 Eliminating Lock-Based Code 并发编程指南描述了使用队列代替同步锁。

假设您的队列是串行的,您可以使用以下构造使其线程安全:

- (void)someMethod {
dispatch_sync(self.queue, ^{

NSDictionary *status = self.status;

// do what you need to with status
});
}

这样,您就可以有效地使用串行队列来同步对 status 字典的访问。

顺便说一句,如果您的队列是自定义并发队列,您可能还需要确保将 paramDict 中的 dispatch_async 替换为 dispatch_barrier_async。如果您的队列是串行的,那么 dispatch_async 就可以了。

我建议您尝试使用队列或《线程编程指南》中描述的同步技术之一来同步对状态的访问。

关于ios - ARC 的多线程自动释放问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16641730/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com