你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> Objc中處理數組越界的一種辦法

Objc中處理數組越界的一種辦法

編輯:IOS開發綜合
  •  

    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塊,因為沒有那個必要.

    1. 上一頁:
    2. 下一頁:
    蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
    Copyright © Ios教程網 All Rights Reserved