【问题标题】:Okay to use nil as BOOL for NO?可以使用 nil 作为 BOOL 来表示 NO 吗?
【发布时间】:2015-09-15 15:23:04
【问题描述】:

我想取消选择 UITableView 中发生突出显示的每个可见单元格。我尝试了这行代码,我很惊讶它确实有效。

[[self.tableView visibleCells]makeObjectsPerformSelector:@selector(setHighlighted:)withObject:nil];

所以我尝试了相反的方法,用这个来突出显示每个单元格:

[[self.tableView visibleCells]makeObjectsPerformSelector:@selector(setHighlighted:)withObject:[NSObject new]];

它的工作原理!像这样编码可以吗?使用对象或 nil 代替布尔值 YES 或 NO?还是会引起什么问题?

【问题讨论】:

  • 也许它不是最好的解决方法,但它会完成这项工作。
  • 抛开原理问题不谈,这就是我重写第一行代码的方式:for (UITableViewCell *cell in [self.tableView visibleCells]) cell.highlighted = NO;

标签: ios objective-c uitableview null boolean


【解决方案1】:

[...] 我很惊讶它确实有效。

这项工作是巧合。这很大程度上取决于架构的调用约定和对象的实际地址。

例如,如果[NSObject new] 将在与 256 字节对齐的地址(尾随十六进制数字 00)处返回一个对象,则它可能会被解释为 NO

这样编码可以吗?

绝对不是。正如我所说,它很脆弱,可能会让其他追随你的开发者感到困惑。

这是 C 标准的摘录(关于调用参数类型与声明不匹配的函数):

6.5.2.2 函数调用

[...]

9) 如果函数定义的类型与表示被调用函数的表达式所指向的(表达式的)类型不兼容,则行为未定义。

【讨论】:

  • @user3351949 不,情况不同。在您的示例中,C 编译器可以看到转换(指向int 的指针类型)并自动执行任何必要的操作。虽然 C 标准说这种转换是“实现定义的”,但地球上的每个编译器都会在这里做正确的事情。
  • 哦,谢谢,我刚开始害怕 :-),哇哦 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多