热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS开发Debug和Release的理解

2019独角兽企业重金招聘Python工程师标准参考:http:blog.csdn.netmad1989articledetails406580331&#

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

<一>

参考&#xff1a; http://blog.csdn.net/mad1989/article/details/40658033

1&#xff0c;Debug和Release版本区别&#xff1f;

众所周知&#xff0c;我们进行iOS开发&#xff0c;在Xcode调试程序时&#xff0c;分为两种方式&#xff0c;DebugRelease&#xff0c;在Target的Setting中相信大家应该看到很多选项都分为DebugRelease&#xff0c;方便我们分别设置&#xff0c;满足调试和发布的不同需求。

Release是发行版本,比Debug版本有一些优化&#xff0c;文件比Debug文件小 Debug是调试版本&#xff0c;Debug和Release调用两个不同的底层库。通俗点讲&#xff0c;我们开发者自己内部真机或模拟器调试时&#xff0c;使用Debug模式就好&#xff0c;等到想要发布时&#xff0c;也就是说需要大众客户使用时&#xff0c;需要build Release版本&#xff0c;具体区别如下&#xff1a;

一、Debug是调试版本&#xff0c;包括的程序信息更多
二、只有Debug版的程序才能设置断点、单步执行、使用TRACE/ASSERT等调试输出语句
三、Release不包含任何调试信息&#xff0c;所以体积小、运行速度快

那么&#xff0c;问题来了&#xff0c;我们调试程序时&#xff0c;该如何生成&#xff08;Build&#xff09;或运行Debug或是Release版本呢&#xff1f;

Xcode左上角&#xff0c;点中项目名称-Edit Scheme&#xff0c;或是菜单栏-Product-Scheme-Edit Scheme 弹出界面如下&#xff1a;

当你这里设置Debug时&#xff0c;你build/Run后就是debug版本&#xff0c;相应的&#xff0c;修改成Release模式&#xff0c;出来的就是release版本&#xff0c;这里可以很方便切换。

2&#xff0c;Archive(归档)的作用&#xff1f;

刚开发时&#xff0c;始终不知道这个的作用&#xff0c;只知道要打包生成APP时&#xff0c;需要用这个&#xff0c;那么到底Archive和Release有什么关系呢&#xff1f;

archive是你要上传包的时候,打包。也就是说Archive只跟APP要上传到appStore的时候有关&#xff0c;一般情况下&#xff0c;只有在那个时候才会用Archive&#xff0c;可以这么理解。所以Archive也分为Debug和Release两个&#xff0c;你可以Archive出一个Debug版本的应用也可以Archive出一个Release的应用。

所以说&#xff0c;Archive和Release没有太大的关系&#xff0c;Archive我们平时一般都不会用到的。

3&#xff0c;Profile

点击运行Profile&#xff0c;profile 之后&#xff0c;会有一个工具选项. 然后你可以查看app 性能

4&#xff0c;Analyze

analyze&#xff0c;是查找静态内存泄漏,以前mrc 的时候会用。Profile和Analyze都可以在Scheme中设置&#xff1a;

总结&#xff1a;

默认run,是debug模式,就是真机联调.
如果你修改为release,是run 的时候, 为发布模式.
直接archive 是系统提供帮助打包的&#xff0c;Archive生成后的文件会小很多~

iOS生成静态库方法-iOS集成静态库-iOS合并静态库_ 参考&#xff1a;

http://blog.sina.com.cn/s/blog_7b9d64af0101jlym.html

<二>

参考&#xff1a; http://www.jianshu.com/p/9c4c92a38468

对于软件开发而言&#xff0c;调试是必须学会的技能&#xff0c;重要性不言而喻。对于调试的技能&#xff0c;基本上是可以迁移的&#xff0c;也就是说你以前在其他平台上掌握的很多调试技巧&#xff0c;很多也是可以用在iOS开发中。不同语言、不同IDE、不同平台的调试&#xff0c;有同性也有个性。今天我们就来学习一下iOS开发中的调试技巧&#xff0c;语言暂用为OC&#xff0c;IDE当然是强大的Xcode。首先说明下&#xff0c;Xcode已经为我们调试项目提供了极大的方便。

【1.普通断点】

断点(Breakpoint)绝对是调试程序的第一大选择&#xff0c;也是掌握的基础技能。顾名思义&#xff0c;当程序运行到断点处时会暂停运行。比如断点打在11行&#xff0c;那么程序就会停在11行&#xff08;注意&#xff1a;程序只运行到了前10行&#xff0c;第11行其实还没有被执行&#xff01;&#xff01;&#xff01;&#xff09;。只要在代码行旁边点击&#xff0c;就能添加一个断点&#xff0c;再次点击&#xff0c;就能让断点不可用&#xff08;disable了&#xff0c;仍然存在&#xff0c;只是不起作用了&#xff09;。在某一行创建断点的快捷键是&#xff1a;command&#43;\

20131601_itfZ.png

20131601_Ll1Y.png

并能在调试过程中在下方看到参数的值&#xff1a;

20131602_X5kY.png

【2.条件断点】

以上的断点只是最普通的&#xff0c;我们还能对断点的属性进行配置&#xff0c;设置条件&#xff0c;使断点更加智能化&#xff0c;右键断点进入编辑对话框&#xff1a;

20131602_DADI.jpeg

我以一个循环作为测试代码&#xff1a;

20131602_evZU.jpeg

循环中的代码每次都要单步执行&#xff0c;可能这并不是我想要的。我想要在i为3的时候中断程序&#xff0c;进行调试&#xff0c;编写条件如下&#xff1a;

20131602_gyEh.jpeg

设置i&#61;&#61;3的条件后&#xff0c;程序就会在该条件时中断&#xff0c;而不会每次到达该位置都中断。中断时输出如下&#xff1a;

20131602_Buax.jpeg

同时也可以设置Ignore参数&#xff0c;会忽略前面n次的断点运行&#xff0c;会在第n&#43;1次中断。

20131602_LosI.jpeg

调试输出如下&#xff1a;

20131603_UgKd.jpeg

同时&#xff0c;还可以查看某个函数被调用的次数&#xff0c;设置Action参数如下&#xff0c;注意要选中Automatically continue after evaluating actions.

20131604_Po4S.jpeg

输出结果如下&#xff1a;

20131604_AbCi.jpeg

【3.异常断点】

断点的功能不限于上面所述。开发iOS知道&#xff0c;如果我们因为异常然后程序crash了&#xff0c;代码就直接跑到main.m的main函数中去了。为什么就不能跑到出现异常的代码中呢&#xff1f;&#xff1f;&#xff1f;异常断点就为我们解决该问题&#xff0c;程序就会在异常出现的那行代码终止。创建异常断点图例如下&#xff1a;

20131604_RUqn.jpeg

如下所示就创建完成了。如果碰到异常crash时&#xff0c;尝试使用异常断点吧。

20131604_TN3Q.jpeg

【4.符号断点Symbolic Breakpoint】

符号断点的创建也同异常断点。一般符号断点可以在你指定的[类名 方法名]时中断执行。

20131605_WvYQ.jpeg

配置符号断点如下&#xff1a;可以当执行到ViewController类的viewDidLoad方法时中断执行。

20131605_O5nO.jpeg

如果你的Symbol只写了一个函数名&#xff0c;那么就会在出现该函数名的地方就中断执行。如下&#xff0c;就会在运行到doAnimation的时候中断。是不是很强大呢&#xff1f;

20131605_LAqx.png

20131605_qdKT.jpeg

【5.Analyze分析器】

Analyze分析器是一种静态的工具&#xff0c;可以对我们的程序进行分析&#xff0c;找出我们未使用的变量&#xff0c;或一些死存储。执行Analyze如下&#xff1a;Product-->Analyze. 如下蓝色的标记就是静态分析的结果。

20131605_FyFq.png

20131605_0gKq.jpeg

当然&#xff0c;我们可以设置在编译程序的时候同时Analyze&#xff0c;把下列选项设为Yes即可。

20131606_s4lR.png

【6.Profile检查器】

这个工具实在是太NB了&#xff0c;三言两语说不完&#xff0c;贴张图&#xff0c;大家感受一下。同样在Product-->Profile中打开。

20131606_Hy4m.jpeg

【7.僵尸对象】

iOS中把那些已经release但还没完全消失的对象叫做僵尸对象&#xff0c;对已经release的对象再次释放&#xff0c;就会发生异常。虽然自从使用ARC后&#xff0c;由于对象释放产生的异常已经大大变少&#xff0c;但偶尔还会出现。开启僵尸对象模式后&#xff0c;就能快速定位到异常位置。开启方式如下&#xff1a;Product-->Scheme-->Edit Scheme. 勾选Enable Zombie Objects即可。

20131606_0CwP.jpeg

【8.lldb命令】

Xcode中使用llvm编译器&#xff0c;公认为最好的C、C&#43;&#43;、OC、Swift编译器。而lldb是llvm中的调试器&#xff0c;我们可以使用一些简单的命令进行调试&#xff0c;我还是把上面的循环代码作为测试代码。

20131606_BQzX.jpeg

断点调试中&#xff0c;使用po命令、print命令在Console控制台打印出变量信息&#xff1a;

20131606_uOBh.jpeg

【9.NSLog打印】

应该说NSLog打印信息是初学者最喜欢的调试手法&#xff0c;也是最简单的调试&#xff0c;通过打印出的信息查看程序运行的路径。但是打印出的信息较少&#xff0c;本身NSLog效率较低&#xff0c;有人使用宏做了部分优化&#xff0c;代码如下&#xff1a;能够打印出所在类名、所在方法名、详细时间、行号。

#import "ViewController.h"

#define NSLog(format, ...) do { \

fprintf(stderr, " %s\n", \

[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], \

__LINE__, __func__); \

(NSLog)((format), ##__VA_ARGS__); \

fprintf(stderr, "-------\n"); \

} while (0)

&#64;interface ViewController ()

&#64;end

&#64;implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

for (int i &#61; 0; i <5; i&#43;&#43;) {

NSLog(&#64;"我的值&#xff1a;%d",i);

}

}

&#64;end

打印结果如下&#xff1a;

 

20131607_Xzbd.jpeg

【10.生命周期方法init,dealloc】

对于ViewController来说&#xff0c;有两个生命周期函数我们可以进行重写&#xff0c;也就是init和dealloc方法。对于某些对象的状态&#xff0c;我们可以在这两个方法中查看。尤其是在dealloc中可以看到当ViewController退出的时候某个对象是否release。

- (instancetype)init

{

self &#61; [super init];

if (self) {

//初始化语句&#xff1b;

}

return self;

}

- (void)dealloc

{

//释放后调用&#xff1b;

}

【11.查看代码运行时间】

有时候我们想要准确的知道某段代码、某个循环执行的时间&#xff0c;然后分析效率等问题&#xff0c;这个时候就需要执行时间是多少。正好看到网上已经有人做了这个工作&#xff0c;我就直接摘下来了。正好也用了宏的方式计算时间&#xff0c;我们只要在需要计算时间的代码块前后写上TICK,TOCK宏即可。当然&#xff0c;原理也是非常的简单&#xff0c;也就是使用NSDate计算差值。

#import "ViewController.h"

#define TICK  NSDate *startTime &#61; [NSDate date]

#define TOCK  NSLog(&#64;"Time: %f", -[startTime timeIntervalSinceNow])

&#64;interface ViewController ()

&#64;end

&#64;implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

TICK;

for (int i &#61; 0; i <5; i&#43;&#43;) {

NSLog(&#64;"我的值&#xff1a;%d",i);

}

TOCK;

}

&#64;end

打印结果如下&#xff1a;

20131607_4IG4.jpeg

【12.手机截屏】

手机截屏也算调试&#xff1f;哈哈。其实也算是开发中的一个小技巧哈。其实大家都会在iPhone上同时按电源键&#43;Home键截屏&#xff0c;然后使用各种通讯软件发给其他人&#xff0c;这个略显不方便。我们来使用Xcode中的方式截屏。当手机接上电脑后&#xff0c;注意要把调试设备选为自己的手机&#xff1a;

20131607_iqte.png

然后选择Debug-->View Debugging-->Take Screenshot...  .然后可以看到手机屏幕已经在你的电脑桌面了。是不是比直接在手机上操作方便多了呢&#xff1f;这样就可以快速的发给其他开发者、PM等人了。

【13.viewDidLoad不建议写太多代码】

个人建议不要在viewDidLoad方法中写入太多代码。尤其是涉及该界面中的动画的时候&#xff0c;因为执行viewDidLoad方法的时候&#xff0c;界面可能还没完全加载出来&#xff0c;如果此时把动画放在viewDidLoad中&#xff0c;可能会造成动画无法显示。当然也不建议把耗时的网络请求和动画效果都放在viewDidLoad中&#xff0c;界面的阻塞也会造成动画无法显示。可以尝试把动画放在viewDidAppear,viewWillAppear方法中。对于这类涉及UI的问题&#xff0c;调试也是比较麻烦的。。。

【14.视图调试】

如今iOS开发的UI设计有很多种方式&#xff0c;比如storyboard&#xff0c;xib&#xff0c;代码实现。对于stoayboard,xib可视化实现是比较简单的&#xff0c;但是对于一些“iOS老程序员”而言&#xff0c;都喜欢使用代码实现UI&#xff0c;并且可能UI层次还比较复杂。这样就给我们新接手项目的开发者带来很多困扰。如何快速查看一个复杂UI的界面层次和布局&#xff0c;最快的方法就是用到视图调试。

当项目运行到某一个界面&#xff08;可以是模拟器或真机&#xff09;时&#xff0c;开启视图调试&#xff0c;点击按钮如图&#xff1a;

20131607_1qb6.png

这样就会进入试图调试&#xff0c;你可以很方便的查看这个界面。这里可以看到控件之间的层次关系。

20131607_G67r.jpeg

左侧的树形层次图可以在查看线程、队列和UI之间切换&#xff1a;

20131607_2PLQ.jpeg

【15】常用的编译宏定义&#xff1a;可以让代码在不同的编译情况下执行。

&#xff08;1&#xff09;__OPTIMIZE__  :用于release和debug的判断&#xff0c;当选择了__OPTIMIZE__  时&#xff0c;可以让代码在release时执行&#xff0c;在debug时不执行。示例如下&#xff1a;

#ifndef __OPTIMIZE__

//这里执行的是debug模式下

else

//这里执行的是release模式下

#endif

&#xff08;2&#xff09;__i386__ 与 __x86_64__  &#xff1a;用于模拟器环境和真机环境的判断。满足该条件的代码只在模拟器下执行。示例代码如下&#xff1a;

#if defined (__i386__) || defined (__x86_64__)

//模拟器下执行

#else

//真机下执行

#endif

&#xff08;3&#xff09;__IPHONE_OS_VERSION_MAX_ALLOWED  :当前编译的SDK版本&#xff0c;可以与__IPHONE_9_0等宏定义进行比较&#xff0c;进行不同版本下代码的执行。示例如下&#xff1a;

if (__IPHONE_OS_VERSION_MAX_ALLOWED &#61;&#61; __IPHONE_9_0) {

//如果当前SDK版本为9.0是执行这里的代码

}else{

//否则执行这里

}

【16】预编译宏 #ifdef    #else  #endif

#ifdef ****

//代码1

else

//代码2

#endif

意思是 如果标识符****已被#define命令定义过&#xff0c;则对代码1进行编译&#xff0c;否则对代码2进行编译。

同时也有#ifndef&#xff0c;则与#ifdef刚好相反。

作者&#xff1a;&#xff08;乞力马...&#xff09;  原文 http://mp.weixin.qq.com/s?__biz&#61;MjM5OTM0MzIwMQ&#61;&#61;&mid&#61;404478233&idx&#61;2&sn&#61;ae55d4f70fce47c11958f0b8536f4370&scene&#61;23&srcid&#61;0322WVWcizsblwnzfHYWq13O#rd


 


转:https://my.oschina.net/u/2560887/blog/714942



推荐阅读
  • 判断编码是否可立即解码的程序及电话号码一致性判断程序
    本文介绍了两个编程题目,一个是判断编码是否可立即解码的程序,另一个是判断电话号码一致性的程序。对于第一个题目,给出一组二进制编码,判断是否存在一个编码是另一个编码的前缀,如果不存在则称为可立即解码的编码。对于第二个题目,给出一些电话号码,判断是否存在一个号码是另一个号码的前缀,如果不存在则说明这些号码是一致的。两个题目的解法类似,都使用了树的数据结构来实现。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 本文介绍了腾讯最近开源的BERT推理模型TurboTransformers,该模型在推理速度上比PyTorch快1~4倍。TurboTransformers采用了分层设计的思想,通过简化问题和加速开发,实现了快速推理能力。同时,文章还探讨了PyTorch在中间层延迟和深度神经网络中存在的问题,并提出了合并计算的解决方案。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • Learning to Paint with Model-based Deep Reinforcement Learning
    本文介绍了一种基于模型的深度强化学习方法,通过结合神经渲染器,教机器像人类画家一样进行绘画。该方法能够生成笔画的坐标点、半径、透明度、颜色值等,以生成类似于给定目标图像的绘画。文章还讨论了该方法面临的挑战,包括绘制纹理丰富的图像等。通过对比实验的结果,作者证明了基于模型的深度强化学习方法相对于基于模型的DDPG和模型无关的DDPG方法的优势。该研究对于深度强化学习在绘画领域的应用具有重要意义。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 本文介绍了在满足特定条件时如何在输入字段中使用默认值的方法和相应的代码。当输入字段填充100或更多的金额时,使用50作为默认值;当输入字段填充有-20或更多(负数)时,使用-10作为默认值。文章还提供了相关的JavaScript和Jquery代码,用于动态地根据条件使用默认值。 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • 在Windows10系统上使用VMware创建CentOS虚拟机的详细步骤教程
    本文详细介绍了在Windows10系统上使用VMware创建CentOS虚拟机的步骤,包括准备条件、安装VMware、下载CentOS ISO文件、创建虚拟机并进行自定义配置、设置虚拟机的ISO与网络、进行安装和配置等。通过本文的指导,读者可以轻松地创建自己的CentOS虚拟机并进行相应的配置和操作。 ... [详细]
author-avatar
小呀么小果冻
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有