在弱对象上调用方法是否有充分的理由?

Is there ever a good reason to call methods on weak objects?

鉴于 self 在 Objective-C 中未保留是不安全的,我们是否可以普遍说没有充分的理由在弱对象上调用方法或访问属性? IE。永远不要这样做:

__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
    [weakSelf doStuff];
});

当然,从技术上讲,如果有另一个对 self 的强引用保证在调用 doStuff 之前保留在范围内,这可能没问题,但这是一个非常糟糕的理由。

如果没有充分的理由,那么让编译器简单地拒绝此类调用不是一个好主意,至少在编译器选项后面吗?

来自您引用的document

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.

换句话说,weakSelf 会在 doStuff 方法运行期间自动保留,因此它是安全的。

通常,如果您调用多个 method/property,您会将弱引用转换为强引用 method/property。

can we generally say that there is no strong reason to ever call methods or access properties on weak objects

不,那没有意义。你一直在调用弱对象的方法!例如,在 Cocoa 中,大多数 delegate 对象是 weak — 因为它们需要如此,因为对象保留其委托是错误的。然而,在委托上调用方法是委托模式的本质;否则,什么是委托 for?

示例:以下是 UIApplication delegate 的声明方式:

@property(nullable, nonatomic, assign) id<UIApplicationDelegate> delegate;

那是一个非 ARC 弱引用(这就是 assign 的意思)。但是您永远不会说不能向应用程序委托发送消息,对吗?