我有一个工厂类,它构建了我定义的不同类型的UITableViewCell,让我们调用它们:TypeATableViewCell和TypeBTableViewCell.
现在我的工厂类中的方法定义如下:
(UITableViewCell *)getCellForIdentifier:(NSString *)标识符cellClass:(__ weak Class)cellClass;
为什么有人会在这里选择使用(__weak Class)而不是(Class).
谢谢,
萨科
解决方法
一般来说,这无关紧要.类被有效地实现 – 一旦在运行时AFAICT中注册,它们就永远不会被注销,因此运行时将始终“保留”它们(就这样).单步执行程序集显示[NSObject retain]是一个no-op(只返回self,不执行任何操作).但是,如果您创建一个新的根类并尝试保留它,就像这样……
Class foo = objc_allocateClassPair(nil,"Foo",0); [foo retain];
…运行时将barf,因为新的root类没有实现retain意味着如果你希望你的API能够容忍那些没有实现retain的新的root类,你必须将它们的用途标记为__weak,这样ARC就不会呼叫保留在他们身上.所以我想,从技术上讲,你总是希望类型为Class的变量很弱,但实际上它不太可能,因为你作为表格单元类使用的任何东西都必须从UITableViewCell继承(它继承自NSObject. )
PS:刚刚介入它,NSProxy在这方面与NSObject相同.似乎只是回归自我而不做其他事情.因此,除非您不创建新的根类,否则您可能会安全地跳过__weak限定符.