3

嗨,这是非常简单的事情,但由于某种原因正在杀死我。

我想将 indexPath.row 与总行数进行比较:

NSInteger *rowCount = (NSInteger *) [self.tableView numberOfRowsInSection:indexPath.section];

if((NSInteger *)indexPath.row < rowCount - 1) {
    //do a
} else {
    //do b
}

但由于某种原因,这不起作用。有这样做的正确方法吗?

4

3 回答 3

4

此代码中不需要任何指针或强制转换。您只是在比较和存储整数值,而不是对象或其他任何东西。请记住 NSInteger 是“原始”类型而不是对象。

NSInteger rowCount = [self.tableView numberOfRowsInSection:indexPath.section];

if(indexPath.row < rowCount - 1) {
    //do a
} else {
    //do b
}
于 2013-09-03T08:49:15.673 回答
2

正如其他人指出的那样,您不应该将整数行数或索引转换为指向整数的指针。

这是一个容易犯的错误,并且源于 Objective-C 是实际的 C,顶部有一层(非常丰富的)奶油。

Foundation 框架中的大多数(如果不是全部)数据结构都以“NS”开头的标识符命名(来自旧的 NextStep 环境),无论它们是对象、普通结构(例如带有 x 和 y 的点)还是某些原始类型比如整数。

如果您不熟悉 C 编程,可能很难理解其中的区别,但归根结底是:

  • 对象由运行时引擎处理,这是一个软件层,通过分配和取消分配所需的内存空间来处理对象的基本生命周期。为此,它使用称为堆的内存部分,而在 C 语言中,您只能通过指针引用堆上的内容。因此,所有 Objective-C 对象都通过一个指针变量来引用:NSString *s = ...

  • 原始类型在 Objective-C 中的处理方式与在 C 中一样。您可以说,每当在 Objective-C 程序中引用整数时,编译器实际上只是将其编译为 C 语言。在 C 中,原始类型不要生活在堆上(除非您手动为它们分配和取消分配内存),而是在堆栈上,或者甚至更好(更快)直接在 CPU 的寄存器中。因此,出于所有实际目的,总是直接引用整数(或浮点数、双精度数等),而不使用指针。

我们必须经历的小麻烦是要了解 Foundation 中定义的数据类型中哪些是原始类型(或原始类型的结构),哪些是 Objective-C 对象。我发现一个简单的方法是查阅文档

整数和浮点数被实现为原始类型而不是对象的原因肯定是性能考虑和与现有 C 库的易于集成。

PS:我知道上面包含一些简化 - 例如,可以使用指向原始类型的指针来发挥自己的优势,或者块是在堆栈上分配的 Objective-C 对象的示例。

于 2013-09-03T09:18:18.353 回答
0

这将起作用

int rowCount = [self.tableView numberOfRowsInSection:indexPath.section];

if(indexPath.row < rowCount - 1) {
    //do a
} else {
    //do b
}
于 2013-09-03T08:47:46.230 回答