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

如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! 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. hdu 5468(莫比乌斯+搜索)

    hdu 5468 Puzzled Elena   /*快速通道*/ Sample Input 5 1 2 1 3 2 4 2 5 6 2 3 4 5   Sample Output Case #1: ...

  2. bzoj1132[POI2008]Tro 计算几何

    1132: [POI2008]Tro Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1722  Solved: 575[Submit][Status] ...

  3. 杜教筛进阶+洲阁筛讲解+SPOJ divcnt3

    Part 1:杜教筛进阶在了解了杜教筛基本应用,如$\sum_{i=1}^n\varphi(i)$的求法后,我们看一些杜教筛较难的应用.求$\sum_{i=1}^n\varphi(i)*i$考虑把它与 ...

  4. ubuntu 安装 WPS for Linux(ubuntu)字体配置(字体缺失解决办法)及卸载libreoffice

    从官网下载安装wps for Linux sudo dpkg -i wps-office_10.1.0.5672~a21_amd64.deb 启动WPS for Linux后,出现提示"系统 ...

  5. 四种常用IO模型

    1) 同步阻塞IO(Blocking IO)2) 同步非阻塞IO(Non-blocking IO)3) IO多路复用(IO Multiplexing)4) 异步IO(Asynchronous IO) ...

  6. js登录,回车登录

    $(document).ready(function(){ $("#loginBtn").click(doLoginEvent); loadCookies(); //回车登录 do ...

  7. FJUT第四周寒假作业之第一集,临时特工?(深度优先搜索)

    原网址:http://210.34.193.66:8080/vj/Contest.jsp?cid=163#P2 第一集,临时特工? TimeLimit:1000MS  MemoryLimit:128M ...

  8. FJUT第三周寒假作业《第九集,离间计》栈

    第九集,离间计 TimeLimit:1000MS  MemoryLimit:128MB 64-bit integer IO format:%I64d   Problem Description 拥有了 ...

  9. PHP 安全 E-mail

    PHP E-mail 注入 首先,请看上一章中的 PHP 代码: <html> <body> <?php if (isset($_REQUEST['email'])) / ...

  10. PHP 实例 AJAX 与 XML

    在 PHP 中,AJAX 可用来与 XML 文件进行交互式通信,具体的通信过程,请参考本文内容! AJAX XML 实例 下面的实例将演示网页如何通过 AJAX 从 XML 文件读取信息: 实例   ...