Messaging a __weak object?

前端 未结 2 953
[愿得一人]
[愿得一人] 2021-02-02 16:50

What happens if I send a message to a weak object? Does sending the message possess the object and hold it in memory until return?

I\'m thinking of this pattern:

2条回答
  •  渐次进展
    2021-02-02 17:27

    From the Clang ARC documentation:

    Reading occurs when performing a lvalue-to-rvalue conversion on an object lvalue.

    • For __weak objects, the current pointee is retained and then released at the end of the current full-expression. This must execute atomically with respect to assignments and to the final release of the pointee.

    Messaging a weak reference performs an lvalue-to-rvalue conversion on the variable, which means the value of the weak reference will be retained and then released at the end of the current full-expression (basically, the statement). It's basically equivalent to assigning to a strong variable whose scope only lasts for the current statement, and then messaging that strong variable.

    The takeaway here is if you want to message a weak variable once, and never touch it again, and you don't care about the side-effects of evaluating the arguments to the method in the case where the weak reference ends up nil, then go ahead and message the weak reference directly. But if you need to refer to the weak reference twice (in separate statements), or the side-effects of evaluating the arguments do matter, then you should assign to a strong variable and test for non-nil before proceeding.

提交回复
热议问题