gpt4 book ai didi

objective-c - 函数中的变量是否对其对象有强引用,或者它们可以在函数体的运行时释放吗?

转载 作者:行者123 更新时间:2023-12-04 10:27:49 26 4
gpt4 key购买 nike

我猜答案是否定的,但我很难找到一个直接的答案。例如:

func doSomething() {
let thing = Things.sharedInstance.list[0]

if let maybeProperty = thing.property { // Program Crashes EXC bad memory access error
// Do something with property
}
}

list作为类属性的唯一强引用,而 thing在函数内部(在类中)没有强引用/增加引用计数?因此,在赋值和可选的解包变量赋值之间的竞争条件下,底层 thing可以解除分配吗?

谢谢! :)

最佳答案

Do variables in functions have strong references to their objects?



是的, thing将保持对 Things.sharedInstance.list[0] 的强引用

Can they be deallocated in the runtime of a function body?



这取决于上下文。
  • 如果您的代码在 上运行单个顺序线程 , 对象 thing指向永远不会在函数执行过程中被释放。
  • 如果您的代码在 上运行多线程或并发 ,它可能会发生(我想这是你的情况)

  • 这里的问题是我们正在比赛,修改对象 thing指向来自多个线程或并发。导致两个线程交错操作如下:
    CURRENT THREAD    |      OTHER THREAD
    -------------------------------------
    | Remove or replace
    | list[0] (called
    | object)
    |
    Load pointer to |
    object |
    |
    | Reduce reference
    | count of object
    |
    | Free object
    |
    Increase reference|
    count of object |
    (!) |
    |
    Access property |
    from object (!) |
    |

    这里可能会发生很多问题,但通常情况下,根据 Apple 文档 Automatic Reference Counting,您会崩溃。

    If ARC were to deallocate an instance that was still in use, it would no longer be possible to access that instance’s properties, or call that instance’s methods. Indeed, if you tried to access the instance, your app would most likely crash.

    关于objective-c - 函数中的变量是否对其对象有强引用,或者它们可以在函数体的运行时释放吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60557993/

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