Tencent / QMUI_iOS

QMUI iOS——致力于提高项目 UI 开发效率的解决方案
http://qmuiteam.com/ios
Other
7.08k stars 1.38k forks source link

QMUI 内的 valueForKey: 用法可能存在一些风险 #1220

Closed MoLice closed 3 years ago

MoLice commented 3 years ago

Bug 表现UITableViewCell(QMUI).qmui_tableView 为例,该方法的实现为:

- (UITableView *)qmui_tableView {
    return [self valueForKey:@"tableView"];
}

本意是希望获取 UITableViewCell 内部的 _tableView 方法的返回值,但由于 key 没有写完整,所以会根据 KeyValueCoding 规定的顺序来查找:

  1. 寻找该对象内的 -get<Key>, -<key>, -is<Key> 并返回,如果找不到则进入下一步。
  2. -get<Key>, -<key>, -is<Key>, -<key>AtIndexes:
  3. ...
  4. _<key>, _is<Key>, <key>, is<Key>
  5. ...

qmui_tableView 这个例子里,直到第4步才能匹配到正确的方法(也即 _tableView),而如果此时业务为 UIViewUITableViewCell 的 Category 增加一个叫 isTableView 的方法,就会由于 -is<Key> 的优先级比 _<key> 高,导致调用 [self valueForKey:@"tableView"] 时优先访问 isTableView 方法,从而出现不可预知的 bug。

截图

如何重现

  1. 在 QD 项目里为 UIView 分类添加 - (BOOL)isTableView 方法。
  2. 打开一个由 UITableViewCell 实现的列表,即可出现 crash。

预期的表现

QMUI 内部的 valueForKey: 写法应该足够安全,以避免业务出现这种莫名的问题。

其他信息

MoLice commented 3 years ago

已发布 4.2.3 修复该问题。