【问题标题】:__deprecated__ not triggering compiler warning with subclass__deprecated__ 不使用子类触发编译器警告
【发布时间】:2010-01-25 20:48:11
【问题描述】:

从 2.0 天开始,我有几个 UITableViewCell 子类覆盖了已弃用的指定初始化程序:

- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier

这段代码为单元格做了一些额外的设置,我正在转换类以使用新的指定初始化器:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

奇怪的是,只有当编译器调用时,编译器才会在子类本身中抛出有关被弃用的方法的警告

[super initWithStyle:style reuseIdentifier:reuseIdentifier]

使用这些子类的所有类都不会收到警告。为了尝试强制它,我在子类的标题中添加了以下内容:

- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier __attribute__ ((deprecated));

奇怪的是,现在所有弃用警告都消失了。

我没有尝试过的一件事是转换子类以覆盖新的指定初始化程序,并查看代码中使用这些单元格的位置现在是否收到来自超类的弃用警告。

我仍然觉得奇怪的是,在我添加了不推荐使用的属性后,所有警告都消失了。

有什么想法吗?

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    我认为问题在于+alloc 返回了一个id 类型的对象,因此编译器不确定您的-initWithFrame:reuseIdentifier: 实际上与已弃用的方法相同。但是,当您调用 [super initWithFrame:reuseIdentifier:] 时,编译器确实知道该方法已被弃用。如果你尝试像[(MyTableCellClass *)[MyTableCellClass alloc] initWithFrame:frame reuseIdentifier:ident] 这样的东西,我希望它会发出警告。

    虽然这并不能真正解释为什么当您自己重新声明该方法时所有警告都会消失。

    【讨论】:

    • 我认为你是其中的一员。我忘记了 alloc 返回 (id) 并且编译器不确定。我敢打赌,如果我将子类更改为仅覆盖新的 DI,那么由于 UITableViewCell 的弃用,类的使用现在将被标记。是时候去试试了。
    • 好吧,我只是更改了所有子类以覆盖 initWithStyle:reuseIdentifer: 并且 initWithFrame:reuseIdentifer: 的所有使用仍然没有被标记。虽然 UITableViewCell 的其他元素是(即 setText :)。并不是说它完全准确,但是当我右键单击 initWithFrame:reuseIdentifier: 并选择“转到定义”时,我会直接进入带有弃用标记的 UITableViewCell 标题。在更改之前,我也将所有子类作为选择。
    • Xcode 的“转到定义”依赖于索引器,这与编译器不同。尝试将 +alloc 的结果转换为您的单元子类。 -setText: 肯定会起作用的原因是因为您在适当类型的变量上调用它。同样,以下应该可以工作:MyTableViewCell *cell = [MyTableViewCell alloc]; [cell initWithFrame:frame reuseIdentifier:ident];
    • 你是对的,如果我将结果中的 (UITableViewCell *) 转换为 +alloc,我会收到警告。这意味着单行 alloc+init 永远不会收到弃用警告。真可惜。确保我在所有位置都进行了更改,这将基于 Find In Project 结果。悲伤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 2019-07-12
    • 2017-02-13
    相关资源
    最近更新 更多