• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ios > OC编程碰到一个奇葩的问题,百思不得其解,求指点

OC编程碰到一个奇葩的问题,百思不得其解,求指点

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-05

佚名通过本文主要向大家介绍了oc,oc兼职网,oc兼职网上海,oc是什么意思,oc兼职等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: OC编程碰到一个奇葩的问题, 百思不得其解, 求指点
描述:

本帖最后由 bolshevik_5pa 于 2017-01-31 01:57:39 编辑

OCNSIntegerNSArray.count

问题描述:
有一个方法, 传入两个NSInteger的参数, 用来检索一个二维数组(NSArray嵌套NSArray). 
传入的参数可能是负的, 也可能大于数组长度, 所以做了安全限定: 
如果是负的, 则反过来从数组尾向前检索(如数组长度是15, 参数是-2, 则取下标为13的元素); 
如果大于数组长度, 则反过来从数组头向后检索(如数组长度是15, 参数是16, 则取下标为1的元素).
且受到调用函数的限制, 就算传递超限的值, 也不会传递(数组长度 * -1)以下, 
或(数组长度 * 2)以上的值, 顶多[-5, 数组长度+5]的范围.
代码如下:
- (PlaygroundBlock *)searchBlockWithCoordinate_X:(NSInteger)x 
Coordinate_Y:(NSInteger)y {
    if (y >= _blockArray.count){
        y -= _blockArray.count;
    } else if (y < 0){
        y += _blockArray.count;
    }
    
    NSArray *array = _blockArray[y];
    if (x >= array.count){
        x -= array.count;
    } else if (x < 0){
        x += array.count;
    }
    PlaygroundBlock *block = array[x];
    return block;
}
y是一维下标, 所以先通过y检索_blockArray; 再通过x检索当中对应的小数组.
我碰到的问题是:
y或x如果传递负数, 那么会执行(y >= _blockArray.count)或(x >= array.count)为真的语句块, 导致本来就是负数的y或x再减去数组长度, 结果显然会崩溃掉; 
而如果传递大于数组长度的值, 也会执行以上条件为真的语句块, 结果倒是正确的; 
传递数组下标范围以内的值, 结果也是正确的.
简而言之就是: x或y明明是负的, count明明是正的, 它就是判定x, y比count大...
问题排查: 
1. 反复检查了_blockArray.count和array.count, 确定获取的数组长度是正确的; 
2. 反复检查了形参x和y的值, 确定是在我上述取值范围[-5, 数组长度+5]的范围内; 
3. 反复打断点测试, 结果只要形参传递进来的时候是负数, 永远只走if为真的语句块, 永远不走else if语句块...
4. 不放心再看了看NSInteger的API文档, 确定这玩意就是long, 没有unsigned什么的...
有没有大神能帮我看看问题到底出在哪了?
后续补充:
我改了一下判断顺序, 先判断是否小于0, 再判断是否大于数组长度:
- (PlaygroundBlock *)searchBlockWithCoordinate_X:(NSInteger)x 
Coordinate_Y:(NSInteger)y {
     if (y < 0){
        y += _blockArray.count;
     } else if (y >= _blockArray.count){
         y -= _blockArray.count;
     }
    
    NSArray *array = _blockArray[y];
    if (x < 0){
        x += array.count;
    } else if (x >= array.count){
        x -= array.count;
    }
    PlaygroundBlock *block = array[x];
    return block;
}
结果当参数是负数时, 运行正确.
虽然问题修复了, 但我的疑问还是没有解决: 
第一段代码的写法为什么会导致明明y或x < count, 却判断y或x >= count为真?


解决方案1:

_blockArray.count 返回值类型为NSUInteger


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 真机测试,clang:error:linkercommandfailedwithexitcode1use-vtoseeinvocat
  • iOS,我在Githubfork别人的仓库后更改了代码,可以用CocoaPods把我的仓库加入项目里吗?
  • iOS支持“用其他应用打开”,plist中设置DocumentTypes为哪种类型可以同时支持doc/docx?<UTIs>
  • [selfimageUrlArrayenumerateObjectsUsingBlock:,这句代码是是做什么用的?
  • 为什么有的书说在初始化方法和dealloc方法总是应该通过实例变量来读写数据?
  • 一句oc代码转成swift
  • ocr软件ios-OCR-Tesseract
  • display:inline-block类方法中使用了block,如何避免循环引用?
  • WEEXstorage模块在iOS端setItem失败
  • 关于GCDAsyncUdpSocket接受到数据后address参数怎么转码成服务器ipip

相关文章

  • 2017-06-05 podinstall时怎么样设置才能不重新按装已经安装的库
  • 2017-06-05 陀螺仪的三轴角速度如何积分计算出角度
  • 2017-06-05 iOSApp在后台时接收到推送消息时,怎么去语音播报?
  • 2017-06-05 C#串口通信AsyncSocket通信客户端识别不了中文
  • 2017-06-05 要做一个支持横竖屏切换的自动布局
  • 2017-06-05 OC网络编程IOSC语言怎么调用OC的NSLog打印?
  • 2017-06-05 真机测试,clang:error:linkercommandfailedwithexitcode1use-vtoseeinvocat
  • 2017-06-05 ios现在主流的开发语言是什么啊
  • 2017-06-05 string转intSwift如何判断int数据是否溢出
  • 2017-06-05 Masonry循环创建一竖列button如何实现

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • (swift)ios网易云音乐app的素材图片图标要怎么导出来?
    • IOS微信第三方登录多个APP添加微信\QQ第三方登录的问题
    • 从零开始制作2048游戏
    • 这种效果是用什么实现的?能否用OpenGL/WebGL实现?
    • iOS蓝牙40如何同时连接多个外设?
    • IOS开发了一个新应用,使用相同BundleID替换了旧应用,想延用旧的coredata数据,无法找到momd
    • SDWebImage加载的网络图片,如何调整显示图片的尺寸
    • (swift)ReactiveCocoa50绑定问题
    • 切换跟控制器后。上一个控制器presentViewController子控制器的VIew还在。为什么?
    • objective-c自定义对象归档问题,这是什么错误?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有