鉴于self在Objective-C中不安全,我们通常可以说没有充分理由在弱对象上调用方法或访问属性吗?即。永远不要这样做:
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf doStuff];
});
当然,从技术上讲,如果在调用doStuff之前有另一个强有力的自我引用保证在范围内,这可能没问题,但这是一个非常糟糕的原因。
如果没有充分的理由,那么编译器简单地拒绝这样的调用是不是一个好主意,至少在编译器选项之后呢?
答案 0 :(得分:2)
来自您引用的document:
对于__weak对象,保留当前的指针对象,然后在当前的完整表达式结束时释放。这必须在分配和指针的最终版本方面以原子方式执行。
换句话说,weakSelf
会在doStuff
方法的持续时间内自动保留,因此非常安全。
通常,如果您要调用多个方法/属性,则可以将弱引用转换为强引用。
答案 1 :(得分:-1)
我们通常可以说没有强有力的理由在弱对象上调用方法或访问属性
不,这没有任何意义。你总是在弱对象上调用方法!例如,在Cocoa中,大多数delegate
对象都是weak
- 正如它们所需要的那样,因为对象保留其委托是错误的。然而,在委托上调用方法是委托模式的本质;否则,什么是代理 for ?
示例:以下是UIApplication delegate
的声明方式:
@property(nullable, nonatomic, assign) id<UIApplicationDelegate> delegate;
这是一个非ARC弱引用(这是assign
的意思)。但是你永远不会说没有消息可以发送给应用代表,不是吗?