Objc中处理数组越界的一种办法

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! 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块,因为没有那个必要.

时间: 2024-09-05 23:27:23

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

如何处理数组越界而不会让程序崩溃?

如何处理数组越界而不会让程序崩溃? 数组越界是非常常见的现象,有时候,你的程序中,因为数组越界而崩溃了,很难找,理想的状态是,数组越界的时候给我们返回nil就好了. 请看下面这个例子: // // RootViewController.m // BeyondTheMark // // Copyright (c) 2014年 Y.X. All rights reserved. // #import "RootViewController.h" @interface RootViewCon

java中数组越界是什么意思

问题描述 java中数组越界是什么意思 java中数组越界是什么意思 是不是数组的元素的类型发生不统一的情况 解决方案 越界就是超过了边界,数组脚标是从0开始的,你定义的数组长度为5,那么你的脚标就只能是0,1,2,3,4 .向上或向下超过了超过了都是越界 解决方案二: 数组越界就是提供的下标超出边界(out of bound),比如 int[] a = new int[10]; 那么 a[-1] 和 a[11]就是越界. 解决方案三: 比如你定义了一个长度为5的数组int[] a = new

VS2010中的WPF程序出现数组越界错误,程序直接终止,但为什么错误列表没有给出相应的提示?

问题描述 VS2010中的WPF程序出现数组越界错误,程序直接终止,但为什么错误列表没有给出相应的提示?每次都需要自己进行调试查问题出现在哪个位置,是我的VS设置有问题吗? 解决方案 解决方案二:你可以调试看看具体问题是在哪里解决方案三:但是我希望能够在错误列表中给出相应的错误提示信息,为什么会没有呢?我记得以前是用,刚开始学习C#,不太熟悉VS2010.引用1楼hefeng_aspnet的回复: 你可以调试看看具体问题是在哪里 解决方案四:运行状态程序crash的时候是直接跳出的,只有调试才给

基于java中byte数组与int类型的转换(两种方法)_java

java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形int转换成byte数组,同时如何把一个长度为4的byte数组转换为int类型.下面有两种方式. public static byte[] int2byte(int res) { byte[] targets = new byte[4]; targets[0] = (byte) (res & 0xf

PHP中数组定义的几种方法_php技巧

Array 数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性.由于数组元素的值也可以是另一个数组,树形结构和多维数组也是允许的. 一般来说定义方法如下面几种: 方法一: $a=array(1,2,4,5,6); <?php $array=array('a','b','c'); $array[]='simon'; pr

java-Java中定义数组必须要指定长度吗,如果是为什么?

问题描述 Java中定义数组必须要指定长度吗,如果是为什么? Java中定义数组必须要指定长度吗,如果是为什么?今天写程序时,前面定义了一个数组是空的int[] a ={};但是在下面用a[i]循环赋值时会出现 java.lang.ArrayIndexOutOfBoundsException错误,当我用int[] a = new int[8];这种形式就不会出现这种错误,这是什么原因,求回答啊 解决方案 Java中的数组是定长的!你这样int[] a ={}; 定义出来的数组a 长度为0,已经是

数组越界 内存泄露-指针或数组越界实在找不到问题了

问题描述 指针或数组越界实在找不到问题了 http://wenku.baidu.com/link?url=e_SMeDv5empBQO07OE4vnfFpYDsc_nZ61H-j6OoSTbwN8J24IgKdxnTHnHk51sKnRx0IbujnnQepn-Ml5_l6n3XJGomwgwt6zxoIdF2E32i 实验五,要交OJ,OJ上题目略有不同. 输入有以下四种情况: 当输入大写英文字母'T'时,表示下一行是文本内容,包含若干英文单词.标点符号以及阿拉伯数字,用于构建二叉查找树.文本

深入解析 ObjC 中方法的结构

因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明. 在上一篇分析 isa 的文章从 NSObject 的初始化了解 isa中曾经说到过实例方法被调用时,会通过其持有 isa 指针寻找对应的类,然后在其中的 class_data_bits_t 中查找对应的方法,在这一篇文章中会介绍方法在 ObjC 中是如何存储方法的. 这篇文章的首先会根据 ObjC 源代码来分

js中一维数组和二位数组中的几个问题示例说明_基础知识

js中的数组,可以存放各种数据类型(数值,字串) js中的数组没有越界,当输出的数组下标越界了,会显示undefined. js中的数组是默认动态增长的 遍历数组的一种简单方式. for(var key in arr){ window.alert(key+"= "+arr[key]); } 在给一个空的二维数组赋值的时候出现的问题: var arr2=[]; arr2[1][1]=45;//js不支持这种赋值方法 解决方法: //在这之前需要初始化定义arr2有多少行. for(var