比较行计数和indexpath.row

时间:2013-09-03 08:42:55

标签: ios objective-c

嗨,这很简单,但由于某种原因让我感到害怕。

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

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

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

正如其他人所指出的,你不应该将整数行计数或索引转换成指向整数的指针。

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

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

如果您不熟悉C编程,可能很难理解其中的区别,但实际上可以归结为:

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

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

我们必须经历的小麻烦是要了解在Foundation中定义的哪些数据类型是原始类型(或原始类型的结构)以及哪些是Objective-C对象。我发现一个简单的方法是咨询the documentation

将整数和浮点数作为基本类型而不是对象实现的原因当然是性能考虑因素,并且易于与现有C库集成。

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

答案 2 :(得分:0)

这将有效

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

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