就在昨天,通过企业id发布了公司使用的一个iOS app 由于在真机调试没有发现问题。就直接替换了线上的文件。但是通过下载安装发现,开启程序后闪退,而且是每次都出现,这就让我感到非常迷茫,真机调试都是没问题的,为什么会出现如此严重的bug。立刻iPhone连接orgnizer。查看device logs 发现都是bad access错误,控制台也出现了Could not lookup ReleaseType from system version dictionary错误,我先检查了bad access定位的代码,没有发现问题。然后就查找releasetype的问题,对于这个问题网上相关资料很少,也没能帮我解决问题。我就继续从代码入手。发现都是与dispatch_queue 有关,我就把关于他的很多资料看了一遍,由于我是iOS5编译,iOS6运行,我就怀疑与dispatch_queue在5 6上的arc差异造成,然后从这个方向入手继续追查(其实我走错了道,后面说)。不断修改相关代码,重新发布,安装运行。由于通过xcode安装是没有任何问题的,因此只能这样调试。折腾下来,问题依旧。然后就在网上搜索所有相关资料。到了12点我依然没有解决问题。只能洗洗睡了,早上起来,脑子清醒了许多,抛弃了昨晚所有的想法,直接从代码入手,一句句注释掉代码,然后调试。仔细的检查代码。最终发现while 循环在应该退出的地方没有退出,会不会是这里的问题呢。修改之后,发布测试。一切正常。果然问题是这里造成的,至于为什么死循环在debug阶看不到问题,我现在还没有明白。
推荐一个关于 iOS Device logs调试的文章:
http://www.raywenderlich.com/23704/demystifying-ios-application-crash-logs
总结一下这次的经历:
1,这是一个愚蠢的bug。 while 死循环。测试没问题不代表发布的没问题,因为还有可能存在不同机型有不同的问题。
2,上线发布没有备份线上版本,造成我只能恢复最老的版本。以后不管什么情况的更新都要做到本分前一个版本。
3,由于没有备份 + debug没有问题,造成我心里紧张,慌乱之下找问题跑偏了方向,造成很多时间的浪费。一定要淡定,否则就乱套了,脑子也就不好使了。
4,没有仔细检查代码,否则早就搞定了。虽然第一次仔细检查了,但是不全面。仔细检查包括全面细致。
5,出现 Could not lookup ReleaseType from system version dictionary 错误 可能是由于代码问题造成。
6,dispatch_release 在 iOS6 arc下不需要使用了,但是在 iOS6以前的版本arc中需要 http://stackoverflow.com/questions/8618632/does-arc-support-dispatch-queues
为什么是一,因为以后还有可能有别的愚蠢出现
相关推荐
1. **HTTP请求与响应**:HTTP是互联网上应用最广泛的一种网络协议,用于客户端和服务器之间的通信。HTTP请求由方法(如GET、POST、PUT等)、URL、HTTP头和可能的请求体组成。HTTP响应则包含状态码、响应头和响应体。...
这个“愚蠢”的操作系统并不是在贬低其价值,反而,它以一种简单易懂的方式揭示了操作系统的核心概念,让那些对计算机体系结构和操作系统原理感兴趣的读者能轻松入门。 操作系统是计算机系统的灵魂,控制并管理硬件...
【标题解析】:“myBox:愚蠢的学校项目”可能是一个学生在学习过程中创建的个人项目,其中"myBox"可能是项目的名字,而“愚蠢的学校项目”可能是一种幽默或者自谦的说法,暗示这是一个初级或者练习性质的编程作业。...
标题 "a-sink-hole:只是愚蠢的" 暗示我们正在探讨一个可能与编程相关的项目或问题,其中“a-sink-hole”可能是项目、函数或者错误的名称,而“只是愚蠢的”可能是开发者对这个问题的初步评价,暗示存在一个简单但易...
wan 这是用于Javascript的python -m SimpleHTTPServer ,还有一些其他功能。 ... 它甚至内置了livereload和内省的隧道。 安装 npm install -g swank 用法 swank [[--ngrok | -n]] [[--watch | -w]] [[--silent | -s]] ...
这是一个简单的测试服务器实用程序,用于调试需要从服务器运行的 Web 应用程序。 安装: sudo npm install tserv -g用法: tserv在托管所有本地文件的当前目录中启动服务器。 tserv -p 8090在端口 8090 上启动服务器
"FactoryMan"不仅仅是教学工具,它还教会玩家软件开发中的一个关键技能——调试。在游戏过程中,玩家编写的代码可能会出现各种错误,导致生产线出现故障。这时,玩家需要像一个真正的程序员一样,通过查看错误提示,...
对于初学者来说,这是一个很好的学习机会,可以通过不断调试、添加新功能来提高编码技能。例如,可以添加更多的过滤条件、增加语音合成功能,或者设置定时任务自动发布经典语录。 此外,开发者还提到希望得到命名...
《JokeFight:我的朋友们的愚蠢游戏》是一款由个人或团队开发的小型娱乐项目,它以轻松幽默的方式展示了朋友间的互动。在这个游戏中,玩家可能会经历各种搞笑的挑战和谜题,旨在带给玩家欢笑和乐趣。游戏的核心部分...
标题“arthurius:与手里剑射击妖精,手里剑射击老漫画,和一个有任务的王子的愚蠢游戏”似乎是指一个游戏项目或者应用程序,它包含手里剑射击、妖精战斗以及一个关于王子的任务等元素。这个标题可能代表了一款冒险...
它的设计目的是将原本简单明了的批处理脚本语言(如DOS批处理或Windows批处理)转变为一种难以理解和执行的代码,这在编程领域中被称为“愚蠢”或“奇特”。FreakC这个名字就暗示了它的非主流和独特性。 ### 批处理...
一、查找bug原因 1、了解 bug 发生的原因,规律;...1、暴力调试; 2、聪明地使用猜测; 3、假设可能造成愚蠢的 4、积极使用断言,不要讲执行代码放入断言,防止Release时该代码不被执行 5、使用日志
Noflux JavaScript应用程序的简单,愚蠢的状态管理。配套包裹版本依存关系DevDependencies 建造例子在线调试: : 。 import React , { Component } from 'react' ;import { connect , state } from '@noflux/react' ...
标题为“GayLights:愚蠢的WebApp来控制我的LED灯”的项目,虽然冠以“愚蠢”之名,但实际上是一个有趣的实践案例,展示了如何利用HTML这一基础网页语言来实现这样的功能。下面我们将深入探讨这个项目的实现细节和...
开发人员调试人类我们喜欢愚蠢的游戏,因此我们扩展了Cards Against Humanity,以开发者的生活方式为重点。 我们称之为-devs.Debug(humanity); 。 最酷的是-反对人类的开发者是devs.Debug(humanity); 。 因此您...
它的名称来源于“列表处理器”的缩写,因其语法特点——使用波兰表示法,即通过括号表示表达式的结构,而常被称为“大量恼人、愚蠢的括号”。Lisp有着丰富的方言,包括Common Lisp、Scheme和Clojure等,其中Scheme以...
"Tank_Game"就是这样一款由作者十年前创作的项目,它虽然被称为“非常愚蠢的‘游戏’”,但实际上,它是对Python编程的一次自由探索和学习的体现。这个项目的核心代码存放在名为“test.py”的文件中,它包含了一些...
这个项目主要用于展示在开发过程中如何处理错误和异常,即“移相开发工作流程中的愚蠢游戏”。Phaser 是一个广泛使用的开源游戏开发框架,它支持HTML5游戏的创建,适用于桌面和移动设备。 Phaser 提供了一系列强大...
在本项目"buildquest:愚蠢的任务建造者"中,我们主要关注的是如何通过构建一系列任务来学习和理解React,这是一个非常流行的JavaScript库,用于构建用户界面,尤其适用于单页应用程序(SPA)。React以其组件化、虚拟...
2. **行编号**:早期的BASIC版本使用行号来标识代码位置,便于调试和组织。 3. **交互式环境**:BASIC通常支持直接在终端或IDE中逐行执行代码,便于实时测试和修改。 **汇编语言的融入** 汇编语言,又称为符号语言...