自动属性合成不会合成属性 - iOS8.3新警告

12

更新至iOS 8.3后,我开始收到一堆在iOS 8.2上没有出现的新警告。其中一个特别引起了我的注意;

@property (strong, nonatomic) IBOutlet UITableView *tableView;

这是在一个“.m”文件中声明的。

iOS8.3中发生了什么变化,以致于出现了这个警告?

Auto property synthesis will not synthesize property 'tableView'; it will be implemented by its superclass, use @dynamic to acknowledge intention

你添加了 tableView 的视图控制器是不是 UITableViewController - Joe
3
FYI,IBOutlets 应该声明为 weak,因为视图本身已经持有一个 strong 引用。避免出现循环引用。https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html - Mark McCorkle
2
@DCGoD 看着我18个月前写的代码,真是太可怕了,哈哈。 - DevC
4
我们都会犯这种错误,哈哈。感到尴尬,学习、重构、反复洗涤。;-) 代码永远不会“完成”。 - Mark McCorkle
4个回答

16

如果你使用的是UITableViewController,则tableView已经被合成了。(即self.tableView是UITableViewController的tableView)。


16

我也遇到了类似的问题。我通过以下方式解决了它。在您的 .m 文件中,在 @implementation 下面写入 @dynamic tableView

希望能解决你的问题。


这并不一定解决根本原因,即您正在覆盖在超类中定义的属性。 - Tash Pemhiwa

11

有什么变化?编译器变得更聪明了。

你可能正在子类化UITableViewController。

UITableViewController已经拥有了一个名为tableView的属性。它已经在UITableViewController中被合成或以其他方式实现。因此,警告告诉你,你没有得到自己的tableView属性,而是得到了由UITableViewController提供的属性。

显然,如果你不知道UITableViewController中的tableView属性,并错误地假设这是你自己的属性,那么就会出问题。这就是为什么你会收到一个警告。所以如果你真的这样做了,那么你的代码一直存在问题,需要修复。

但是,如果你只是在你的代码中声明@property,但是你知道它实际上是UITableViewController的属性,那么没有任何损害,但是删除@property,因为它是错误的。


感谢详细的解释。这正是最后一点。我看的确实是旧代码。幸好有人提醒了我。 - DevC

1

我曾经遇到过一个类似的问题,当时在创建自定义的UITableViewCell时,我新建了一个名为imageView的属性。由于已经存在一个叫做imageView的属性,所以我不断收到错误信息。最终我只需将其名称改为projectImageView,问题就得到了解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接