我有一个工厂类,它构建了我定义的不同类型的UITableViewCell,让我们调用它们:TypeATableViewCell和TypeBTableViewCell。
现在我工厂类中的方法定义如下:
+ (UITableViewCell*)getCellForIdentifier:(NSString*)identifier cellClass:(__weak Class)cellClass;
为什么有人会选择在这里使用(__weak Class)而不只是(Class)。
谢谢, 尼古拉斯
答案 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
限定符。