gpt4 book ai didi

objective-c - 使用 ARC 避免悬挂指针

转载 作者:行者123 更新时间:2023-12-02 07:36:26 25 4
gpt4 key购买 nike

我有一个对象,该对象包含对对象的 strong 引用:

@property (nonatomic, strong) NSObject *thing;

在其他地方,我有一个传递对象引用的方法:

[thirdObject doSomething:secondObject.thing];

在一种情况下(一百万或十亿),thirdObject 最终使用悬空指针,因为该对象被交换并且没有所有者。

我可以通过这样做来避免这种情况吗? ARC 有什么不同吗?

NSObject *thing = secondObject.thing
[thirdObject doSomething:secondObject.thing];

如果不是,我怎样才能避免这种情况?

编辑:消息是“消息发送到解除分配的实例 0xwhatever”

最佳答案

如果不应用某种线程安全,就不能在多线程上读写属性。现在原则上,对于像字符串这样的简单对象,也许只应用 atomic 就足够了。参见 What's the difference between the atomic and nonatomic attributes?详细了解它的作用。

说实话,我真的不太喜欢atomic。我知道它的作用,但它似乎是一种获得您真正想要的东西的麻烦方式(而且通常最终会比您想要的少)。这不是一个非常通用的解决方案;我无法“稍微”自定义 atomic 访问器(比如添加 setNeedsDisplay 等)。

这就是我喜欢基于队列的访问器的原因。它们的工作量稍大,但对很多问题都很有效。

@property (nonatomic, readwrite, strong) dispatch_queue_t thingQueue;
@property (nonatomic, strong) NSObject *thing;

- (id)init {
...
_thingQueue = dispatch_queue_create("...", DISPATCH_QUEUE_CONCURRENT);
...
}

- (NSObject *)thing {
__block NSObject *thing;
dispatch_sync(self.thingQueue, ^{
thing = _thing;
});
return thing;
}

- (void)setThing:(NSObject *)thing {
dispatch_barrier_async(self.thingQueue, ^{
_thing = thing;
});
}

我喜欢这个系统的地方在于它允许所有读者同时阅读。当作者尝试更新时,无论涉及多少读者,都保证不会饿死。而且它总是很快返回。当值发生变化时,队列中也有一个明确的点,以便在写入者之前请求值的读者将始终获得旧值,而写入者之后的读者将始终获得新值,无论有多少竞争在队列中。

关键是getter是同步的,所以会一直等到能拿到值,setter包含了barrier。屏障意味着“在我运行时,不能从这个队列中调度其他 block 。”所以你有一堆并行运行的阅读器 block ,然后 setter 屏障出现并等待所有阅读器完成。然后它单独运行,设置值,然后它后面的读者可以再次并行运行。

关于objective-c - 使用 ARC 避免悬挂指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15934036/

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