0

我有一个协议,我希望实现将 __weak 引用用于方法参数。我将我的协议定义为:

@protocol TestProtocol
-(void) op:(__weak NSObject*)x;
@end

然后我创建一个实现:

-(void) op:(NSObject*)x
{
}

x 成为强参考。如果我将 __weak 声明移动到协议实现中,'x' 是一个弱引用。

由于协议的调用者已经保留了强引用,我想确保实现不会创建另一个强引用。

4

1 回答 1

3

我有点惊讶编译器没有抱怨声明不匹配。而且,果然,它没有。我提交了雷达#13730581 以查看编译器人员所说的内容。

正如@hypercrypt 所引用的那样,在一般情况下,ARC 不会保留或释放方法的参数。性能与正确性牺牲大到足以保证这种权衡的少数情况之一。(请注意,您会在未优化的情况下看到 storeStrong,但在 -Os 情况下发布构建情况下没有这样的东西)。

这意味着您实际上是在通过暗示方法主体中的代码来防御针对对象创建的强引用(并且,根据评论,当@throw“越过”框架时,所述强引用不会被拆除)。

你对此无能为力——如果你传递xNSMutableArray'saddObject:方法,它将创建一个强引用。

因此,在一般情况下,实际上并没有一种方法可以防止创建对对象的强引用作为变量使用的副作用。

特定于 NSException 清理,无需担心。异常应该是致命的,并且在抛出异常后应用程序的状态是未定义的(除非您可以确保没有系统代码以任何方式与异常相关,这实际上是不可行的)。

// code tossed in main.m to play w/compiler behavior

@protocol TestProtocol
-(void) op:(__weak NSObject*)x;
@end

@interface DogBowl:NSObject <TestProtocol>
@end
@implementation DogBowl
-(void) op:(NSObject*)x
{
}
@end
于 2013-04-24T20:56:08.973 回答