ff1*_*f10 10 iphone null xcode objective-c uitableview
我有以下UITableView DataSource方法:
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
Run Code Online (Sandbox Code Playgroud)
在某些项目(即部分索引标题)上,我只想返回"无",以便表视图不会跳转到任何部分.我试图返回nil,但是我得到了"返回使得没有强制转换的指针整数" - 警告,因为NSInteger显然不是一个对象,只是一个32/64位整数的typedef.
如何才能对特定部分索引标题没有回报/反应?
Qui*_*lor 22
返回nil是一个错误,因为您返回的是整数基元,而不是对象.(你得到一个强制转换警告,因为nil它实际上是一个#define求值((void *)0),它是一个空指针,而不是一个整数零.)与Cocoa接口的Objective-C代码的最佳选择可能是使用NSNotFound,使用#define的NSIntegerMax是在整个Cocoa中表示接收器中不存在给定值等(另一种选择是使用-1,这在C代码中更常见.最好的方法取决于调用代码期望和可以处理的内容.)
虽然NSNotFound是一个有符号的值,但它足够大,你不太可能遇到范围问题.(NSIntegerMax差不多只有一半NSUIntegerMax,很少有人能够远程接近2,147,483,647个物体 - 更不用说两倍多了 - 在32位的土地上.在64位中,忘了它;你的机器中的物理RAM耗尽了很长时间在用完索引的整数之前.)
说到这个,Cocoa约定是使用NSUInteger(而不是NSInteger)索引.无符号整数不能为负数,这为索引值提供了一些完整性保护; 除此之外,更容易理清意外的整数溢出/下溢.如果这是一个自定义数据源方法(似乎是),我强烈建议切换到使用无符号整数.(它可能有助于记住/实现NSInteger并NSUInteger占用相同数量的字节,它们只是以不同方式解释这些位,因此您不会通过切换类型来"浪费"任何空间.)