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

Nic*_* M. 6 objective-c uitableview ios

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

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

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

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

谢谢,尼古拉斯

ipm*_*mcc 10

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

Class foo = objc_allocateClassPair(nil, "Foo", 0);
[foo retain];
Run Code Online (Sandbox Code Playgroud)

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

PS:刚刚介入它,NSProxy就像NSObject这方面一样.似乎只是返回而不self做任何其他事情.因此,除非您不创建新的根类,否则您可能会安全地跳过__weak限定符.