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

相关文章
|
云安全 安全 网络协议
安全研究所 | 伪装搜狗输入法的木马分析
近年来,黑灰产业的犯罪团伙数量急剧上升,特别是在与办公软件相关领域。这些团伙主要针对国内企业用户,通过伪装成合法的办公软件进行精心设计的诈骗和诱导行为,其主要目的是欺骗企业员工下载并激活木马病毒,以此来窃取公司资金或获取企业敏感文件。
|
10月前
|
SQL Dubbo Java
线程池:故障梳理总结
本文从故障视角和技术视角深入分析了线程池类问题,帮助开发者理解故障原因及优化方法。故障视角中,总结了数据库相关(如热更新、大表加字段、索引问题)、深分页、调用量过大等典型场景,指出慢SQL或高并发可能导致线程池满,最终影响服务可用性。技术视角则聚焦于远程调用IO慢、计算密集型任务及自定义线程池配置不当等问题,强调通过设置合理的超时时间(如ConnectionTimeout、SocketTimeout)和采用fast-fail理念来快速失败,避免资源浪费。同时,文章建议通过流控、背压机制保护系统,并谨慎处理重试逻辑以防止雪崩效应。这些经验和教训对提升系统稳定性具有重要参考价值。
192 0
|
机器学习/深度学习 自然语言处理 算法
深度学习算法简介(一)
深度学习算法简介(一)
888 0
|
C# 虚拟化 容器
[WPF]WPF Data Virtualization和UI Virtualization
原文:[WPF]WPF Data Virtualization和UI Virtualization 这篇博客将介绍WPF中的虚拟化技术。 1. Data Virtualization 通常情况下我们说数据虚拟化是指数据源没有完全加载,仅加载当前需要显示的数据呈现给用户。
1714 0
|
C++
C++函数及参数
传值->传递的是数据副本(结构、普通数据类型数据) 传地址->传递的是数据变量的地址(数组等) 传值的缺点是需要复制数据副本,数据量大可能增加内存需求,降低系统运行速度; 传地址也有传地址的不好的地方,比如在不需要修改原数据的时候,一不小心把数据修改了,造成程序的违需求性;
1048 0
|
网络安全 数据安全/隐私保护 网络协议
|
网络协议 网络安全 数据安全/隐私保护
|
Java Android开发 前端开发