标签存档: Xcode

使用 Link Map 分析 iOS App 二进制文件体积

为什么要分析 App 文件体积?

作为一个 iOS 开发者,通常会需要关心 App 体积的大小,这将会是影响用户在 App Store 看到 App 时,是否决定下载的因素之一,如果 App 的体积太大,可能会使得用户放弃下载 App,特别是在用户使用蜂窝网络的时候。

对于一个 iOS App 来说,它的体积通常由以下几个部分组成:

  • 二进制可执行文件
  • 资源文件
  • 第三方 Framework

对于资源文件和第三方 Framework 来说,我们可以直接通过统计文件大小的方式来统计它们所占用的磁盘空间,但是对于二进制文件来说,我们该如何去统计它里面所包含的代码大小组成呢?

如何分析?

非常幸运的,Xcode 为我们提供了 Link Map 这样的一个统计文件来展示代码在经过编译之后,在可执行二进制文件中的实际占用体积大小,通过分析这个文件,我们就可以精确地知道,对应到每一个代码文件,它在最终生成的可执行二进制文件中所占的体积。

为了让 Xcode 能输出我们所需要的 Link Map 文件,需要在 Xcode 进入到工程的设置界面,选择需要输出 Link Map 的 Target,选择 Build Settings Tab,在搜索框中输入“link map”(注意 link …

阅读全文 »

[笔记] Objective-C 中模拟泛型及 Xcode 格式化代码插件

记录一些 iOS & OS X 开发过程中学到或有趣的东西。

Objective-C 中模拟泛型

今天看到的一个辅助代码,可以在 Objective-C 代码中添加泛型的支持:

泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部份,那些部份在使用前必須作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。(via )

泛型一般出现在 .NET、Java 或 C++ 的代码里面。

在 Objective-C 里面,像数组之类的容器,在取单个元素时,返回类型都是 id,这个时候如果要使用返回对象的一些属性,就需要先转换一下类型,或者使用 getter 方法来获取。

如果用了泛型之后,就很方便了,可以直接以 arr.lastObject.prop 的方式来访问。

使用了上面这个代码使 Objective-C 支持泛型后,就可以像下面这样写代码了:

generics example

这个辅助代码是一个大宏,给 Objective-C 添加泛型支持是以以下几个方面来做到的,例如给 MyClass 添加泛型支持来说明:

  1. 定义一个 MyClass 的 Protocol
  2. 给各个容器类(例如 NSArray、NSMutableArray、NSSet)添加 Category,重新定义各个容器操作方法的返回值和参数类型
    1. 获取单个元素的方法返回值类型修改为 MyClass *
    2. 返回容器的方法返回值类型修改为 NSArray<myclass> *
    3. 参数类型同样处理


阅读全文 »

给 iOS 项目添加自动更新属性

在 iOS 项目中,有些时候为了方便跟踪发布时的版本,方便调试,或者为了展示程序的编译日期,可以通过在 Info.plist 里面添加自定义属性的方式来实现,但是这个工作是一个纯粹机械的重复劳动,每次手工去更新是比较麻烦的一个事情。

好在 Xcode 项目支持自定义脚本的编译步骤,我们可以通过在编译过程中使用自定义脚本去更新 Info.plist。

在 /usr/libexec 目录下面,有一个工具 PlistBuddy,它可以很方便地修改 plist 文件,而不需要去用 sed 之类的编辑工具来修改。

为了在使用 PlistBuddy 的时候可以直接用 Set 命令设置属性,我们先在 iOS 项目的 Info.plist 里面加一个需要自动更新的属性,例如 BUILD_DATE 和 GIT_REVISION,类型选择为字符串,值填 AUTO_GENERATED。

然后在 iOS 项目的 Target 上添加一个新的编译步骤 Run Script Build Phase:

下页就是要编写脚本了

# 获取编译的日期
DATE=`date +%Y.%m.%d`

# 获取编译时 Git 库的短版本号
GIT_REVISION=`git rev-parse 


阅读全文 »