2013-04-10 21 views
1

爲了避免崩潰問題,如果我在訪問像下面的代碼之前的每個索引之前檢查數組數,那麼是否有任何性能問題?對於大型應用程序來說這是一種好的做法還是不好的做法?通過檢查數組數量來防止數組索引崩潰,是否有任何性能問題?

我的代碼是:

-(BOOL)checkIndexAvailability:(NSArray *)array_ withIndex:(int)index_ 
{ 
    if ((array_.count-1)>=index_) { 
     return TRUE; 
    } 
    return FALSE; 
} 

當我訪問任何陣列我把這樣的:

if ([self checkIndexAvailability:regDataArray withIndex:2]) { 
    lastName = [regDataArray objectAtIndex:2]; 
} 
+1

不用調用方法並獲取BOOL值,您可以直接檢查計數值。這比方法調用要好。 – Mani 2013-04-10 12:59:09

+1

或者甚至用你的數組長度來保存一個變量並且檢查它(而不是每次都碰到數組) – Alladinian 2013-04-10 13:02:58

+1

直接檢查索引<[數組數量]會更易讀。 – Anupdas 2013-04-10 13:05:54

回答

1

隨着Alladanian,brainLikeApple和克里斯Gellic的答案的幫助下,我的理解是防止數組索引出界崩潰的問題,可以通過以下這種方式來解決:

int arrayCount = [regDataArray count]; 

NSString *lastName = (2 <arrayCount) ? [regDataArray objectAtIndex:2] : @"Last Name Not Found"; 
NSString *address = (4< arrayCount) ? [regDataArray objectAtIndex:4] : @"No Address Found"; 

有不需要創建另一種方法或每次訪問數組計數方法。

0

我認爲,這樣做的方式不應該耽誤您的應用程序多。

但是考慮到當你編程時,如果事情按照正確的方式完成,你的程序就不應該試圖獲得一些不存在的數組位置。

你可以找到一些更多的信息Bounds checking

1

我建議只是在做一個快速的線上單向讓它更好一點。這樣的事情:

lastName = (regDataArray.count - 1 > 2) ? [regDataArray objectAtIndex:2] : nil; 

雖然你不會注意到任何速度與你的方式或我的不同。

0

我認爲它可以封裝在類別中。或者,也許可以使用運行時庫更改標準實現。 如果你在調試模式下添加類似assertion的東西,那麼它會很好,所以你不會在發送錯誤索引的實現中隱藏問題。 P.S.我認爲它不會對性能產生重大影響。

0

我不認爲有任何理由添加這樣的支票,因爲NSArray已經做了類似的檢查。當index無效時會引發異常。

現在,也許你在問我爲什麼認爲引發異常會更好,然後默默跳過objectAtIndex。那麼,如果你試圖索引那些不存在的東西,這是一個錯誤。默默地跳過代碼只會隱藏你的bug。

+0

是的,你是對的。但我使用從OCR生成的未知數組。因此取決於圖像捕捉可能會有所不同。如果數組索引不存在,那麼我也可以通知它,它比崩潰更好。 – sumon 2013-04-10 13:40:39

+0

然後,一個正常的檢查'我 Sulthan 2013-04-10 14:02:42