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

时间:2017-02-21 17:44:18

标签: objective-c automatic-ref-counting weak-references clang++

鉴于self在Objective-C中不安全,我们通常可以说没有充分理由在弱对象上调用方法或访问属性吗?即。永远不要这样做:

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

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

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

2 个答案:

答案 0 :(得分:2)

来自您引用的document

  

对于__weak对象,保留当前的指针对象,然后在当前的完整表达式结束时释放。这必须在分配和指针的最终版本方面以原子方式执行。

换句话说,weakSelf会在doStuff方法的持续时间内自动保留,因此非常安全。

通常,如果您要调用多个方法/属性,则可以将弱引用转换为强引用。

答案 1 :(得分:-1)

  

我们通常可以说没有强有力的理由在弱对象上调用方法或访问属性

不,这没有任何意义。你总是在弱对象上调用方法!例如,在Cocoa中,大多数delegate对象都是weak - 正如它们所需要的那样,因为对象保留其委托是错误的。然而,在委托上调用方法是委托模式的本质;否则,什么是代理 for

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

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

这是一个非ARC弱引用(这是assign的意思)。但是你永远不会说没有消息可以发送给应用代表,不是吗?