大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.

如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)


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块,因为没有那个必要.

Objc中处理数组越界的一种办法的更多相关文章

  1. php中的数组遍历的几种方式

    [(重点)数组循环遍历的四种方式]   1.使用for循环遍历数组     conut($arr);用于统计数组元素的个数.     for循环只能用于遍历,纯索引数组!!!!     如果存在关联数 ...

  2. Java中的数组越界问题

    Java中数组初始化和OC其实是一样的,分为动态初始化和静态初始化, 动态初始化:指定长度,由系统给出初始化值 静态初始化:给出初始化值,由系统给出长度 在我们使用数组时最容易出现的就是数组越界问题, ...

  3. C++中的数组越界

    C++中数组发生越界错误时, compiling过程不会报错, linking过程也不会报错, 会在executing过程中发生意想不到的错误或问题.

  4. js中删除数组元素的几种方法

    1:js中的splice方法 splice(index,len,[item])    注释:该方法会改变原始数组. splice有3个参数,它也可以用来替换/删除/添加数组内某一个或者几个值 inde ...

  5. mysql存储过程中遍历数组字符串的两种方式

    第一种:多次使用substring_index()的方法 DELIMITER $$ DROP PROCEDURE IF EXISTS `array`$$ CREATE  PROCEDURE `arra ...

  6. 在android中画圆形图片的几种办法

    在开发中常常会有一些需求,比方显示头像,显示一些特殊的需求,将图片显示成圆角或者圆形或者其它的一些形状. 可是往往我们手上的图片或者从server获取到的图片都是方形的.这时候就须要我们自己进行处理, ...

  7. Java中JNI的使用详解第五篇:C/C++中操作Java中的数组

    在Java中数组分为两种: 1.基本类型数组 2.对象类型(Object[])的数组(数组中存放的是指向Java对象中的引用) 一个能通用于两种不同类型数组的函数: GetArrayLength(ja ...

  8. Java中创建数组的几种方法

    Java中创建数组的几种方法 public static void main(String[] args) { //创建数组的第一种方法 int[] arr=new int[6]; int intVa ...

  9. 【转】java中byte数组与int类型的转换(两种方式)----不错

    原文网址:http://blog.csdn.net/piaojun_pj/article/details/5903009 java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法, ...

随机推荐

  1. 例10-5 uva12716

    题意:gcd(a,b) = a^b,( 1≤ a , b ≤ n) 思路: ① a^b = c, 所以 a^c = b,而且c是a的约数,枚举a,c,再gcd判断 ② 打表可知 a-b = c,而且a ...

  2. poj1741Tree 点分治

    上午学习了点分治,写了1个半小时终于写出一个代码--poj1741,可以说是个模板题. 分治:对于每个儿子找出重心,分别处理 注意:1.每次处理一个重心后,ans减去对它儿子的处理 原因:因为统计方法 ...

  3. MySQL插件实现浅析——插件的调用

    一. MySQL中的动态插件 最初想到这个问题是在学习mysql半同步复制相关问题的时候,为何在mysql运行时install半同步插件并开启后就能起到作用,他是如何让事务停下来等待的.安装插件的时候 ...

  4. Thread类中的静态方法

    1.currentThread() currentThread()方法返回的是对当前正在执行线程对象的引用. package thread; /** * 线程类的构造方法.静态块是被main线程调用的 ...

  5. (转载)JVM知识小集

    1. 内存模型以及分区,需要详细到每个区放什么. 2. 堆里面的分区:Eden,survival from to,老年代,各自的特点. 3. 对象创建方法,对象的内存分配,对象的访问定位. 4. GC ...

  6. map函数、filer函数、reduce函数的用法和区别

    Map函数 map函数的用法如下: def add_one(x): return x+1 #使用普通函数 v1 = map(add_one,[1,2,3]) v1 = list(v1) print(v ...

  7. java里String类为何被设计为final

    前些天面试遇到一个非常难的关于String的问题,"String为何被设计为不可变的"?类似的问题也有"String为何被设计为final?"个人认为还是前面一 ...

  8. opencv视屏流嵌入wxpython框架

    前几篇博客分享搭建人脸识别与情绪判断的环境和源码,但是没有UI,界面很难看,一打开就是opencv弹出的一个视屏框.处女座的我看着非常难受,于是决定做一个UI,稍微规矩好看一点,再怎么说,这样的话也算 ...

  9. 给定 n×n 的实数矩阵,每行和每列都是递增的,求这 n^2 个数的中位数。

    #define COL 4 #define ROW 4 int findMedian(int matrix[][COL], int row, int col) { int* arr = new int ...

  10. SQL_CALC_FOUND_ROWS equivalent in PostgreSQL

    https://www.postgresql.org/message-id/1185863074.10580.91.camel%40linda.lfix.co.uk On Tue, 2007-07-3 ...