为什么在Objective-C的函数定义中使用(__weak Class)?

时间:2013-09-20 21:31:35

标签: ios objective-c uitableview

我有一个工厂类,它构建了我定义的不同类型的UITableViewCell,让我们调用它们:TypeATableViewCell和TypeBTableViewCell。

现在我工厂类中的方法定义如下:

+ (UITableViewCell*)getCellForIdentifier:(NSString*)identifier cellClass:(__weak Class)cellClass;

为什么有人会选择在这里使用(__weak Class)而不只是(Class)。

谢谢, 尼古拉斯

1 个答案:

答案 0 :(得分:10)

一般来说,这无关紧要。 Class es被有效地实现 - 一旦在运行时AFAICT中注册,它们就永远不会被注册,因此运行时总是“保留”它们(就这样)。单步执行程序集会显示+[NSObject retain]是一个无操作(只返回self,不执行任何操作)。但是,如果您创建一个新的根类并尝试保留它,就像这样......

Class foo = objc_allocateClassPair(nil, "Foo", 0);
[foo retain];

...运行时将barf,因为新的根类没有实现retain,这意味着如果您希望您的API能够容忍未实现retain的新根类,那么您将拥有将其用途标记为__weak,以便ARC不会在其上调用retain。所以我猜,技术上你会总是希望类型为Class的变量变弱,但实际上它不太重要,因为你会使用任何东西因为表格单元格类必须从UITableViewCell继承(继承自NSObject。)

PS:刚刚介入,NSProxy在这方面与NSObject相同。似乎只返回self而不执行任何其他操作。因此,除非您不创建新的根类,否则您可能会安全地跳过__weak限定符。