6

我有一个工厂类,可以构建我定义的不同类型的 UITableViewCell,我们称它们为:TypeATableViewCell 和 TypeBTableViewCell。

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

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

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

谢谢,尼古拉斯

4

1 回答 1

10

一般来说,这无关紧要。Classes 被有效地实习——一旦向运行时 AFAICT 注册,它们就永远不会被取消注册,因此运行时将始终“保留”它们(就是这样)。单步执行程序集表明这+[NSObject retain]是一个无操作(仅返回 self,不执行任何其他操作)。但是,如果您创建一个新的根类并尝试保留它,就像这样......

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

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

PS:刚踩过,在这方面NSProxy是一样的。NSObject似乎只是回来self,什么都不做。因此,除非您要创建新的根类,否则您可能可以安全地跳过__weak限定符。

于 2013-09-20T22:02:30.057 回答