Closed MoLice closed 3 years ago
Bug 表现 以 UITableViewCell(QMUI).qmui_tableView 为例,该方法的实现为:
UITableViewCell(QMUI).qmui_tableView
- (UITableView *)qmui_tableView { return [self valueForKey:@"tableView"]; }
本意是希望获取 UITableViewCell 内部的 _tableView 方法的返回值,但由于 key 没有写完整,所以会根据 KeyValueCoding 规定的顺序来查找:
UITableViewCell
_tableView
-get<Key>, -<key>, -is<Key>
-get<Key>, -<key>, -is<Key>, -<key>AtIndexes:
_<key>, _is<Key>, <key>, is<Key>
在 qmui_tableView 这个例子里,直到第4步才能匹配到正确的方法(也即 _tableView),而如果此时业务为 UIView 或 UITableViewCell 的 Category 增加一个叫 isTableView 的方法,就会由于 -is<Key> 的优先级比 _<key> 高,导致调用 [self valueForKey:@"tableView"] 时优先访问 isTableView 方法,从而出现不可预知的 bug。
qmui_tableView
UIView
isTableView
-is<Key>
_<key>
[self valueForKey:@"tableView"]
截图
如何重现
- (BOOL)isTableView
预期的表现
QMUI 内部的 valueForKey: 写法应该足够安全,以避免业务出现这种莫名的问题。
valueForKey:
其他信息
已发布 4.2.3 修复该问题。
Bug 表现 以
UITableViewCell(QMUI).qmui_tableView
为例,该方法的实现为:本意是希望获取
UITableViewCell
内部的_tableView
方法的返回值,但由于 key 没有写完整,所以会根据 KeyValueCoding 规定的顺序来查找:-get<Key>, -<key>, -is<Key>
并返回,如果找不到则进入下一步。-get<Key>, -<key>, -is<Key>, -<key>AtIndexes:
_<key>, _is<Key>, <key>, is<Key>
在
qmui_tableView
这个例子里,直到第4步才能匹配到正确的方法(也即_tableView
),而如果此时业务为UIView
或UITableViewCell
的 Category 增加一个叫isTableView
的方法,就会由于-is<Key>
的优先级比_<key>
高,导致调用[self valueForKey:@"tableView"]
时优先访问isTableView
方法,从而出现不可预知的 bug。截图
如何重现
UIView
分类添加- (BOOL)isTableView
方法。UITableViewCell
实现的列表,即可出现 crash。预期的表现
QMUI 内部的
valueForKey:
写法应该足够安全,以避免业务出现这种莫名的问题。其他信息