Objc的數組如果在訪問時索引非法,則會拋出NSRangeException異常,貌似沒有妥協的辦法.
這個不像ruby,對於數組的訪問有2套API,一種和Objc類似非法異常鐵定報錯;另外一種出現異常只是返回一個非法的值,這也很方便,尤其在某些情況下.
一般的在Objc中如果想要處理這種情況,可以在每次訪問前檢查Index是否合法,但還有一種方法,就是寫捕獲異常的處理代碼,如下:
//重新調整當前地圖中隊伍的順序
-(void)reorderPlayers{
//其他處理代碼...
GameCharacter *followGC = nil;
GameCharacter *targetGC = _panda;
NSInteger maxFollowCount = MIN(2, gd.players.count-1);
for (int i = 1; i <= maxFollowCount; i++) {
className = gd.players[i][@'playerName'];
followGC = [GameCharacter gcWithName:className wihtGameScene:_gameScene];
NSDictionary *dict;
@try {
//如果之前在游戲中添加了新的角色(之前地圖中只有1個,現在內部數據變為2個)則必須處理數組訪問異常
dict = [orgPlayers objectAtIndex:i];
followGC.position = [dict[@'Position'] CGPointValue];
[followGC setFaceDirection:[orgPlayers[i][@'FaceTo'] intValue]];
[followGC followInPlace:targetGC];
}
@catch (NSException *exception) {
if ([exception.name isEqualToString:@'NSRangeException']) {
CCLOG(@'A NSRangeException happened!');
//如果出現范圍異常表示followGC是新添加的角色,我們調用follow而不是followInPlace方法
[followGC follow:targetGC];
}else{
@throw [NSException exceptionWithName:@'otherErr' reason:@'otherErr' userInfo:nil];
}
}
[_bgLayer addChild:followGC];
targetGC = followGC;
}
}
代碼其他的游戲邏輯不用去管,主要看其中的異常捕獲和處理方法.
在注釋那行之後可能發生索引非法的異常,所以我們用@try…@catch機制對其進行捕獲,在發生異常時我們做變通處理,否則代碼流保持不變.
注意,這裡沒有用到@finally塊,因為沒有那個必要.