Xcode一些小工具总结

开发中常用的Xcode快捷键

一句话总结:
理清脉络,熟能生巧,东西用熟练了,就是自己的。

对文件的操作

  • 对文件的增,即增加文件、增加文件夹、增加项目。
  • 对文件的删,即关闭窗口、移除到项目外、删除到垃圾桶。
  • 对文件的改,即打开文件、保存文件、另存为。
  • 对文件的查,即查找到某个类、查看刚刚浏览、头文件和实现文件来回切换
command+N(增文件) command+W(关闭窗口) command+O(打开) command+shift+O(查某个类)
command+option+N(增文件夹) Remove Reference(在xcode中移除,【但文件还在项目中】) command+S(保存) command+control+左/右键(按刚浏览的顺序退/进)
command+shift+N(新建项目) Remve to Trash(直接删除到垃圾桶,【文件不在项目中】) command+shift+S(另存为) command+control+上/下键(h和m文件间切换)

对代码的操作

  • 对代码的增,即直接编写、复制、黏贴。
  • 对代码的删,即删除一个字符、删除一行字符。
  • 对代码的改,即代码缩进、代码移动、格式化代码、注释、撤销、调试、选中。
  • 对代码的查,即定位到某个方法、定位到某一行、定位到行头行尾、定位到最顶最后、光标定位在中央、搜索某个关键字
command+C(复制) control+K(删除光标右边的左右内容) command+[ (左缩进一个tab,可以直接按tab键) control+6(定到某个方法)
command+V(粘贴) control+D(删除光标右边一个字符) command+] (右缩进) command+L (定到具体某一行)
command+ option +[ (代码往上交换,移动一行) command+方向键左/右(定位到首行/行尾
command+ option +] (代码往下交换,移动一行 ) command+方向键上/下(定位到类文件第一行/最后一行)
command+ i (格式化代码) control+L(将光标定位窗口居中处,方便观看代码上下文)
command+/ (注释) command+F (搜索某个关键字)
command+Z (撤销)
调试
command+R (运行)
command+. (停止)
command+shift+B (编译)
command+ \ (设置断点)
选中
command+shift +键盘左键(光标定位在右边,换完之后全选该行)
command+shift +键盘右键(光标定位在左边,换完之后全选该行)
command+A(全选)

对代码编辑区的操作

将不必要的功能面板尽可能的隐藏,需要用到的时候才调用出来即可。操作的功能就是:

  • 隐藏编辑区左边
  • 隐藏编辑区右边
  • 隐藏编辑区下面
  • 将Xcode全屏
  • 将Xcode隐藏
  • 打开/关闭双视图
编辑区
command + 0(数字)(隐藏/显示代码编辑区左边)
command+ option + 0(数字)(隐藏/显示代码编辑区右边)
command+ shift + Y(数字)(隐藏/显示代码编辑区下面)
command+ control + F(全屏)
command+ H (隐藏xcode /command +tab出现)
command+ option + enter (打开双试图)
command + enter (关闭双试图)

对模拟器的操作

  • 回到首页: command + Shift + H 按一次
  • HOME键摁两次: command + Shift + H 按两次
  • 旋转 :command + 左/右
  • 调整模拟器大小: command + 1, 2, 3, 4, 5
  • 模拟器(显示)不显示键盘: command + k
  • 启用/关闭从电脑键盘输入:cmd+shift+k
  • 截屏: command + S
  • 复制屏幕: command + control + C
  • 粘贴: command + V
  • 隐藏模拟器: command + H
  • 关闭模拟器: command + Q
  • 模拟锁屏:command + L
  • 屏幕解锁:先按 command + shift + H, 再滑动解锁
  • 双指拖动手势:option + shift
  • 双指缩放手势:option

模拟慢速网络(弱网环境)

  • 模拟器可以通过 Charles工具来模拟慢速网络

  • 真机,设置 》开发者 》Status 》Network Link Conditioner 如果手机设置没找到该选向,可以尝试连接电脑,用Xcode 的Origanizer将其设置成测试设备


内存泄露检查工具

项目中存在的内存泄露问题的检测做了一些总结,一些检测工具的使用及简单内存泄露问题的处理。

  • Analyzer(静态分析)
  • MLeaksFinder (第三方工具)
  • Instruments Leaks (动态检测)

Analyaer

不需要运行程序,通过 Product->Analyze 或快捷键 command+shift+B 进行代码分析。
分析代码上下文的语法结构和内存情况,找出代码中潜在错误 Analyzer主要分析四种问题:

  • 逻辑错误:访问空指针或未初始化的变量等;
  • 内存管理错误:如内存泄漏等;
  • 声明错误:从未使用过的变量;
  • API 调用错误:未包含使用的库和框架。

在我做南莲园池导航定位项目用到 CoreLocation 框架的需要手动释放问题,就是通过 Analyzer 检测出来的。
对于App 的整体性能,以及持续定位的节能上有了很大的进步

说明: Analyzer由于是编译器根据代码进行的判断, 做出的判断不一定会准确, 因此如果遇到提示, 应该去结合代码上文检查一下;还有某些造成内存泄漏的循环引用通过Analyzer分析不出来。

MLeaksFinder

1
pod 'MLeaksFinder'

或将下载的 MLeaksFinder 文件导入工程中,
在 MLeaksFinder.h 中 设置是否开启内存泄漏检测,以及是在模拟器中开始还是在真机中开启。

1
2
3
4
5
6
7
8
9
10
11
//***内存泄漏控制开关,注释该行代码打开内存泄漏工具,打开该行代码关闭内存泄漏****
//#define MEMORY_LEAKS_FINDER_ENABLED 0
#ifdef MEMORY_LEAKS_FINDER_ENABLED
#define _INTERNAL_MLF_ENABLED MEMORY_LEAKS_FINDER_ENABLED
#else
//仅在模拟器打开内存泄漏检测
#if TARGET_IPHONE_SIMULATOR //模拟器
#define _INTERNAL_MLF_ENABLED DEBUG
#elif TARGET_OS_IPHONE //真机
#endif//TARGET_IPHONE_SIMULATOR
#endif//_INTERNAL_MLF_ENABLED MEMORY_LEAKS_FINDER_ENABLED

具体操作步骤:
不断重复 push 和 pop 同一个 UIViewController,一旦有疑似内存泄漏的地方,就会弹出提示框,控制台也会输出调用栈的层级信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[文件:MLeaksMessenger.m   行数:36] Memory Leak: (
MCLocateAddressViewController,
UIView,
BMKMapView,
BMKInternalMapView,
BMKTapDetectingView,
BMKAnnotationContainer
)
[文件:NSObject+MemoryLeak.m 行数:54] Possibly Memory Leak.
In case that BMKAnnotationContainer should not be dealloced, override -willDealloc in BMKAnnotationContainer by returning NO.
View-ViewController stack: (
MCLocateAddressViewController,
UIView,
BMKMapView,
BMKInternalMapView,
BMKTapDetectingView,
BMKAnnotationContainer
)

展示视图自上而下的调用层级,这里需要注意一些三方 SDK 控件导致的疑似泄漏,可能会因其内部的 cache 机制或者释放不及时而被误判为内存泄漏。

Instruments Leaks

  1. Xcode 中 按住 command + I 或者菜单栏 Product – Profile
  2. 双击 Leaks 或者按 choose,打开 Leaks 面板
  3. 在显示的 Leaks 面板中,点击左上角红色点,即可运行内存检测
  4. 在运行过程中如果发现Leak Checks(如图)出现红色X说明检测到内存泄露,将鼠标点击Leak Checks,在下方即可看到内存泄漏的相关信息

定位内存泄漏代码位置

  • 选择 Leaks 有时候默认是 Run lssues,这时需要将其切换为 Leaks
  • 选择 call Three
  • 此时,仍然看不到具体的代码位置,需要选择底部的 Call Tree,在弹窗中选择 Invert Call Tree 和 Hide System Libraries,即可显示出具体内存泄漏的代码

Call Tree 四种选项具体含义:

  • Separate by Thread:按线程分开做分析,这样更容易揪出那些吃资源的问题线程。特别是对于主线程,它要处理和渲染所有的接口数据,一旦受到阻塞,程序必然卡顿或停止响应。
  • Invert Call Tree:反向输出调用树。把调用层级最深的方法显示在最上面,更容易找到最耗时的操作。
  • Hide System Libraries:隐藏系统库文件。过滤掉各种系统调用,只显示自己的代码调用。
  • Flattern Recursion:拼合递归。将同一递归函数产生的多条堆栈(因为递归函数会调用自己)合并为一条。
  • 注意:Core Foundation 等底层操作它们不支持 ARC,还需要手动内存管理对象的创建和释放。
    CLLocationCoordinate2D 是 系统框架 CoreLocation 中 一个 C 的 结构体,包含经度和纬度两个值 (CLLocation 是一个 objc 的 对象),需要通过 free 手动释放。这里需要注意以 Core 开头的系统框架的内存管理。

双击选中行,带有定位箭头的即可跳转 Instrument 中具体的代码

  • 如果没有定位箭头怎么办?
  • 点击项目工程文件-Buidl Setting-All-搜索Debug Information Format-Debug里选择DWARF with dSYM File
  • 默认情况下,只有 release 环境下为 DWARF with dSYM File,其他环境均为 DWARF。当 Debug Information Format 为 DWARF with dSYM File 的时候,构建过程中多了一步 Generate dSYM File,最终产出的文件也多了一个 dSYM 文件。然后,重新编译启动 Instruments Leaks,重复以上步骤即可定位到具体代码。