2010-01-07 72 views
9

我有以下的UITableView數據源的方法:上NSInteger的返回類型方法返回nil

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

在某些項目(即節索引標題)我只是想回到「無」,使表視圖贏得」跳到任何部分。我試圖返回零,但我得到了「返回使指針沒有轉換的整數」 - 警告,因爲NSInteger顯然不是一個對象,只是32/64位整數的typedef。

如何在特定部分索引標題上實現不返回/反應?

回答

21

返回nil這裏是一個錯誤,因爲你返回的是一個整數原語而不是對象。 (因爲nil實際上是#define,它的計算結果爲((void *)0),它是一個空指針,而不是整數零),因此與Cocoa交互的Objective-C代碼的最佳選擇可能是使用NSNotFound ,一個#define代表NSIntegerMax,它在整個Cocoa中用來表示給定的值在接收器中不存在等。(另一個選擇是使用-1,這在C代碼中更常見。什麼效果最好取決於調用代碼期望並且能夠處理)。

儘管NSNotFound是一個有符號的值,但它足夠大以至於不太可能遇到範圍問題。 (NSIntegerMax大約是NSUIntegerMax的一半,很少有人在32位的土地上遠程接近2,147,483,647個對象 - 更不用說是兩倍多了 - 更不用說是那麼多了 - 在64位中,忘記它了;你的物理內存不足機器很久沒有用完索引整數。)

說到這一點,可可慣例是使用NSUInteger(而不是NSInteger)作爲索引。無符號整數不能爲負數,它提供了對索引值的一些健康保護;除此之外,整理意外的整數溢出/下溢變得更容易。如果這是一個自定義數據源方法(好像是),我強烈建議切換到使用無符號整數。 (這可能有助於記住/認識到NSIntegerNSUInteger佔用相同的字節數,它們只是以不同的方式解釋這些位,所以你不會通過切換類型來「浪費」任何空間。)

+0

感謝奎因,在我的情況下這兩個值似乎工作得很好。 – ff10 2010-01-07 22:08:05

+0

關於'NSNotFound'的大提示,謝謝! – Prairiedogg 2010-03-02 06:22:53

+0

這是幾年前的應用程序,我不得不開始維護。在維護代碼的同時,我在XCode中看到了170多個警告。很少有這種錯誤造成的! :-) 謝謝! (Y) – 2015-11-19 10:54:45