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

Posted

技术标签:

【中文标题】在 NSInteger 返回类型方法上返回 nil【英文标题】:Return nil on NSInteger return type method 【发布时间】:2010-01-07 20:49:36 【问题描述】:

我有以下 UITableView DataSource 方法:

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

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

如何实现对特定栏目索引标题的无返回/无反应?

【问题讨论】:

【参考方案1】:

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

虽然NSNotFound 是一个有符号值,但它足够大,您极不可能遇到范围问题。 (NSIntegerMax 大约是 NSUIntegerMax 的一半,在 32 位域中,很少有人能远程接近 2,147,483,647 个对象——更不用说是两倍了。在 64 位中,别管它了;你会用完的早在您用完索引整数之前,您机器中的物理 RAM。)

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

【讨论】:

这是几年前的应用程序,我不得不开始进行维护。在维护代码的同时,我目前在 XCode 中看到了 170 多个警告。很少有人是由这个错误引起的! :-) 谢谢! (Y)

以上是关于在 NSInteger 返回类型方法上返回 nil的主要内容,如果未能解决你的问题,请参考以下文章

self 在 vi​​ewController 的方法中总是返回 nil

Swift的可选链,类型转换和扩展

UITextView beginOfDocument 返回 nil

Go错误处理

如果类型设置为专辑,PHAssetCollection fetchAssetCollectionsContainingAsset 返回 nil

Object-C在Nil上调用方法