我有一个协议,我希望实现对方法参数使用__weak引用。我将我的协议定义为:
@protocol TestProtocol
-(void) op:(__weak NSObject*)x;
@end
然后我创建了一个实现:
-(void) op:(NSObject*)x
{
}
x成为强大的参考。如果我将__weak声明移到协议实现中,'x'是弱引用。
由于协议的调用者已经保留了强大的引用,我想确保实现不会创建另一个强引用。
答案 0 :(得分:3)
我有点惊讶编译器没有抱怨声明不匹配。而且,果然,它没有。我提交了雷达#13730581以了解编译器人员的说法。
正如@hypercrypt引用的那样,ARC不会在一般情况下保留或释放方法的参数。性能与正确性牺牲的少数情况之一足以保证这种权衡。 (请注意,您将在非优化案例中看到storeStrong,但在-Os案例版本构建案例中没有这样的事情。)
这意味着你实际上是通过方法体中的代码暗示来防御针对该对象创建的强引用(并且根据评论,当@throw
时,强引用不会被删除“超过”框架。)
您无法做到这一点 - 如果您将x
传递给NSMutableArray
的{{1}}方法,它会创建一个强大的参考。
因此,在一般情况下,实际上没有一种方法可以防止对对象的强引用被创建为可变使用的副作用。
特定于NSException清理,不值得担心。异常应该是致命的,并且在抛出异常之后应用程序的状态是未定义的(除非您可以确保没有系统代码以任何方式涉及异常,这实际上不可行)。
addObject: