导航:首页 > 编程语言 > ios代码模拟内存警告

ios代码模拟内存警告

发布时间:2025-10-06 00:39:04

⑴ 如何针对app crash进行专项测试,测试中用到了哪些辅助工具

一、如何获得crash日志

当一个iOS应用程序崩溃时,系统会创建一份crash日志保存在设备上。这份crash日志记录着应用程序崩溃时的信息,通常包含着每个执行线程的栈调用信息(低内存闪退日志例外),对于开发人员定位问题很有帮助。

如果设备就在身边,可以连接设备,打开Xcode - Window - Organizer,在左侧面板中选择Device Logs(可以选择具体设备的Device Logs或者Library下所有设备的Device Logs),然后根据时间排序查看设备上的crash日志。这是开发、测试阶段最经常采用的方式。

如果应用程序已经提交到App Store发布,用户已经安装使用了,那么开发者可以通过iTunes Connect(Manage Your Applications - View Details - Crash Reports)获取用户的crash日志。不过这并不是100%有效的,而且大多数开发者并不依赖于此,因为这需要用户设备同意上传相关信息,详情可参见iOS: Providing Apple with diagnostics and usage information摘要。

考虑到并不是所有iphone用户都允许自动发送诊断报告(crash日志),而且对于部分提交到Apple得crash日志,开发者还需要手动去拉取,然后找到对应的符号文件进行解析——这是一件很繁琐的事情。所以实际项目开发中,通常接入现有的crash收集工具(参考1,参考2),或者自己编写一个进行自动化收集、解析和统计汇总。

二、如何解析crash日志

当获得一份crash日志时,我们需要将初始展示的十六进制地址等原始信息映射为源代码级别的方法名称和代码行数,使其对开发人员可读。这个过程称为符号化解析。要成功地符号化解析一份crash日志,我们需要有对应的应用程序二进制文件以及符号(.dSYM)文件。

如果处于开发调试阶段,通常Xcode都能匹配到crash日志对应的二进制文件和符号文件,所以能够帮我们自动解析。

如果处于测试阶段,测试人员已经安装了不同的版本(比如alpha、beta版本),那么需要保存好对应版本的二进制文件和符号文件,以便在应用程序崩溃时对crash日志进行解析。对于这种场景下产生的crash日志,只需要将.crash文件、.app文件和.dSYM文件三者放在同一个目录下,然后将.crash文件拖放到Xcode - Window - Organizer中左侧面板Library下的Device Logs中,即可进行解析。

如果要提交发布,那么我们通常会先执行Clean,再Build,最后通过Proct - Archive来打包。这样,Xcode会将二进制文件和符号文件归档在一起,可以通过Organizer中的Archives进行浏览。

这里是一份关于如何解析crash日志的讨论:http://stackoverflow.com/questions/1460892/symbolicating-iphone-app-crash-reports 。

三、如何分析crash日志

在分析一份crash日志之前,如果开发人员对于常见的错误类型有所了解,那定是极好的。
crash日志的产生来源于两种问题:违反iOS策略被干掉,以及自身的代码bug。

1. iOS策略

1.1 低内存闪退
前面提到大多数crash日志都包含着执行线程的栈调用信息,但是低内存闪退日志除外,这里就先看看低内存闪退日志是什么样的。
我们使用Xcode 5和iOS 7的设备模拟一次低内存闪退,然后通过Organizer查看产生的crash日志,可以发现Process和Type都为Unknown:

而具体的日志内容如下:

第一部分是崩溃信息,包括识别标识、软硬件信息和时间信息等。
第二部分是内存页分配信息,以及当前占用内存最多的进程,上图中为crashTypeDemo。
第三部分是具体的进程列表,描述着每个进程使用内存的情况以及当前状态。在较早的版本中可以在某些进程后面看到“jettisoned”字样,表明这些进程使用过多内存被终止了,而现在我们看到的是“vm-pageshortage”字样。

当iOS检测到内存过低时,它(的VM系统)会发出低内存警告通知,尝试回收一些内存;如果情况没有得到足够的改善,iOS会终止后台应用以回收更多内存;最后,如果内存还是不足,那么正在运行的应用可能会被终止掉。
所以,我们的应用应该合理地响应系统抛出来的低内存警告通知,对一些缓存数据和可重新创建的对象进行释放,同时要避免出现内存泄露等问题。

低内存闪退是由iOS策略决定终止应用程序运行的,同样基于iOS策略的还有Watchdog超时和用户强制退出。

1.2 Watchdog超时
Apple的iOS Developer Library网站上,QA1693文档中描述了Watchdog机制,包括生效场景和表现。如果我们的应用程序对一些特定的UI事件(比如启动、挂起、恢复、结束)响应不及时,Watchdog会把我们的应用程序干掉,并生成一份响应的crash报告。

这份crash报告的有趣之处在于异常代码:“0x8badf00d”,即“ate bad food”。
如果说特定的UI事件比较抽象,那么用代码来直接描述的话,对应的就是(创建一个工程时Xcode自动生成的)UIApplicationDelegate的几个方法:

所以当遇到Watchdog日志时,可以检查下上图几个方法是否有比较重的阻塞UI的动作。

QA1693举的例子是在主线程进行同步网络请求。如果我们是在公司的Wifi环境下使用则一切顺利,但当应用程序发布出去面向很大范围的用户,在各种网络环境下运行,则不可避免地会出现一片Watchdog超时报告。
另一种可能出现问题的场景就是数据量比较大的情况下进行的数据库版本迁移(同样是在主线程上),这也是促使我写这篇总结的一个直接因素。

⑵ iphone开发需要什么

开发环境的要求
硬件:
1.苹果电脑, 必须是基于Intel的Macintosh计算机。
2.iPhone或iPod Touch,主要用来测试编写好的程序。
软件:
1.苹果系统MacOS。
2.iPhone SDK(请从http://developer.apple.com/iphone/下载最新版SDK),SDK中包含苹果公司的集成开发环境Xcode,iPhone模拟器及其它一些开发工具。
开发环境的简单介绍
开发环境主要包括

Xcode (主要开发工具)
Interface Builder (界面快速设计工具)
iPhone Simulator (iPhone模拟器)
SDK(Software Development Kit,软件开发工具包)

Xcode简单介绍
开发iPhone OS及Mac OS X应用,需要在Mac OS X运行Xcode开发工具
Xcode是Apple的开发工具套件,支持项目管理、编辑代码、构建可执行程序、代码级调试、代码的版本管理、性能调优等等
Interface Builder 简单介绍
可视化地设计应用程序的用户界面。
从Interface Builder的控件库中通过拖拽创建诸如窗口,视图,菜单,按钮等
可视化的设置控件属性,建立各控件之间的连接;
保存后的nib文件包括了控件对象,控件配置,以及控件布局等信息,程序加载nib文件时根据这些信息创建对象。
Xcode 与 Interface Builder 的联系
同时使用Xcode和Interface Builder工具,简化代码,便于维护,加快开发
使用Xcode来设计程序的逻辑,使用Interface Builder 来设计程序的界面。
关键字IBOutlet和IBAction在Xcode中用来声明属性和方法,在Interface Builder中与这些声明建立连接。
iPhone模拟器
iPhone模拟器是可以在电脑上部署和测试你的应用程序的目标平台
iPhone模拟器提供了类iPhone的环境,通过菜单选项,可以模拟屏幕锁,屏幕转向,内存警告等功能
因为电脑没有提供一些必要硬件,所以iPhone模拟器也有功能限制
iPhone模拟器
功能限制:
✕ 不能使用GPS定位
✕ 不能使用加速计
✕ 不支持超过2个手指的触摸的多点触摸
✕ 不能打电话
✕ 不能使用3G网络
✕ 不能使用相机和麦克风
✕ 仅提供一些原装程序如Safari,Contact,Photos,Settings
✕ 无法测试程序对iPhone CPU和内存的消耗情况

SDK -Software Development Kit,软件开发工具包。
为iPhone平台,Mac OS X系统编写的软件开发包和软件框架。使用它提供的类和API等其它资源来快速开发针对特定硬件平台和操作系统的程序。
SDK有不同平台的版本(如iPhone平台,Mac OS X平台)和同一平台的不同版本。可以让我们开发部署不同平台和同一平台不同版本的应用程序。
开发文档的使用

Xcode带有文档浏览器,包括了类参考,API参考等。
访问苹果开发者官网(http://developer.apple.com/iPhone/),里面有示例源代码,技术指导文档,参考文档,视频指导等等丰富的资源。

Objective-C语言是为支持面向对象编程而设计的一个简单的计算机语言
Objective-C是标准的ANSI C的一个小而强大的扩展集
Objective-C对C的扩展都是基于Smalltalk语言
Objective-C给了C完全的面向对象编程能力。
Objective-C的编译器基于gcc编译器。
Objective-C语法是GNU C/C++语法的超集,
Objective-C编译器能够编译C(.c),C++(.mm)以及Objective-C(.m)的源代码。
Objective-C 类
一个类由两部分组成:
接口(Interface),声明方法,变量,指出父类和遵守的协议。文件后缀.h;
实现(Implementation),实现类,主要包括方法的实现。文件后缀.m

Objective-C 类的声明
类的声明的基本格式:
@interface ClassName : ItsSuperclass
{
instance variable declarations //实例变量声明
}
method declarations //方法声明
@end
比如:
@interface Rectangle:NSObject
{
BOOL filled; NSColor *fillColor;
@private:
float width; float height;
}
+ alloc; //类方法,[Rectangle alloc]
- (void)display; //实例方法 [rectangle display]
- (float)width; //存取器方法,和变量同名,获取变量
- (void)setWidth:(float)inWidth; //set+变量名,设置变量值
- (void)setWidth:(float)inWidth height:(float)inHeight;
@end

Objective-C 编译器对Objective-C源代码(.m)进行编译,要求方法返回值类型和参数类型都要用括号括起来。
-(void)setWidth:(float)width height:(float)height;
多参数方法,有必要表明各个参数的功能
Objective-C 头文件导入
#import "ItsSuperclass.h”
@interface ClassName : ItsSuperclass
{
instance variable declarations
}
method declarations
@end
#import关键字导入一个类的声明,和C++中#include功能一样
区别于#include,可以保证同一个类的声明只被导入一次

Objective-C 类名的引用
#import "ItsSuperclass.h”
@class Rectangle;
@interface ClassName : ItsSuperclass
{
Rectangle *rectangle;
}
@end
@class 告诉编译器Rectangle是一个类,不需要引入它的头文件;
@class 缩短编译代码,减轻编译器负担。
Objective-C 类的实现
_每个类的实现中必须导入相应头文件。如
#import "ClassName.h”
@implementation ClassName
method definitions
@end

阅读全文

与ios代码模拟内存警告相关的资料

热点内容
图像隐藏在哪个文件里 浏览:406
装镜像文件时找不到启动盘 浏览:259
tv直播APP下载有哪些 浏览:148
ps特效教程视频 浏览:649
什么app买美妆便宜 浏览:558
达通数据上半年营收多少 浏览:768
微信名带晴字的 浏览:225
苹果软件app内购买怎么办 浏览:235
extjs4grid选中行事件 浏览:96
甄嬛传在什么app上播 浏览:663
慧编程怎么制作国庆小视频 浏览:160
jspclass位置 浏览:177
word公式分栏 浏览:477
ios代码模拟内存警告 浏览:754
如何查看mysql数据库用户 浏览:439
线切割割长度怎么编程 浏览:50
电脑扫描文件分辨率多少 浏览:641
mct无dump文件 浏览:730
javacs是什么 浏览:328
连接个人热点密码错误 浏览:784

友情链接