在NSInteger返回类型方法上返回nil

时间:2010-01-07 20:49:36

标签: iphone objective-c xcode uitableview null

我有以下UITableView DataSource方法:

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index 

在某些项目(即部分索引标题)上,我只想返回“无”,以便表视图不会跳转到任何部分。我试图返回nil,但是我得到了“返回从没有强制转换的指针生成整数” - 警告,因为NSInteger显然不是一个对象,只是一个32/64位整数的typedef。

如何才能对特定部分索引标题没有回复/反应?

1 个答案:

答案 0 :(得分:22)

返回nil是一个错误,因为您返回的是整数基元,而不是对象。 (你得到一个强制警告,因为nil实际上是一个#define,其求值为((void *)0),这是一个空指针,而不是整数零。)Objective-C的最佳选择与Cocoa接口的代码可能使用 NSNotFound #define用于NSIntegerMax,在整个Cocoa中用来表示给定的值不存在于接收器等(另一种选择是使用-1,这在C代码中更常见。最有效的取决于调用代码期望和可以处理的内容。)

尽管NSNotFound是一个有符号值,但它足够大,以至于您极不可能遇到范围问题。 (NSIntegerMax大约是NSUIntegerMax的一半,很少有人能够在32位的土地上远远接近2,147,483,647个物体 - 更不用说两倍多了。在64位中,忘了它;你是'在用完索引的整数之前很久就会耗尽机器中的物理RAM。)

说到这,Cocoa约定是使用NSUInteger(而不是NSInteger)来表示索引。无符号整数不能为负数,这为索引值提供了一些健全保护;除此之外,更容易理清意外的整数溢出/下溢。如果这是一个自定义数据源方法(似乎是),我强烈建议切换到使用无符号整数。 (记住/意识到NSIntegerNSUInteger占用相同数量的字节可能会有所帮助,它们只是以不同的方式解释这些位,因此您不会通过切换类型来“浪费”任何空间。)< / p>