xcode各项配置详解

1.Xcode IDE概览



说明:从左到右,依次是“导航窗格(Navigator)->边列(Gutter)->焦点列(Ribbon)->代码编辑窗口(Standard/Primary Editor)”。

  • 边列(Gutter:显示行号和断点。
  • 焦点列(Ribbon):灰色深度与代码嵌套深度相关:鼠标悬停可突出显示右侧相应代码块(Focus code blocks on hover),鼠标单击可折叠右侧相应代码块(Code folding)。

2.偏好设置

通过“command+,”快捷键或”Xcode|Preferences”菜单呼出偏好设置。

(1)主题及字体(Preferences->Fonts & Colors)

选中一种主题(theme),例如“Midnight”,推荐使用Monokai、Ciapre。将 `*.dvtcolortheme` 文件拷贝到 `~/Library/Developer/Xcode/UserData/FontAndColorThemes/`即可安装主题, 重启 Xcode 即可选用。

Xcode默认字体为menlo,也可选择 Consolas、Monaco、Consolas、Droid Sans Mono、Source Code Pro、Bitstream Vera Sans 等其他等宽字体。

shift 选择主题 Source Editor/Console 中的所有项,点击 Fonts 可更改字体(大小)。

(2)编辑器配置(Preferences->Text Editing)

Editing

  • Show Line Numbers:在gutter中显示行号。
  • Code folding ribbon:显示焦点列。

    Focus code blocks on hover:鼠标悬停时突出显示右侧相应代码块。

  • Page guide at column:显示一行最多支持80个字符的提示分割线。
Indentation
  • Prefer indent using:Spaces(为保持一致的视觉呈现和行末注释对齐,建议使用空格)
  • Tab width:4 spaces(tab expand,1个tab=4个空格)
  • Indent width:4 spaces(自动缩进步长=4个空格)

(3)跳转打开方式Preferences->Navigation

  • Activation:When a tab or window opens,make it active。当新建窗口或标签时,立即激活聚焦。
  • Navigation:Uses Primary/Focused Editor。打开Project Navigator中指定的文件时,在主编辑器窗口/当前聚焦窗口打开,建议选择Focused
  • Optional Navigation:Uses Single Assistant Editor。打开Project Navigator中指定的文件或跳转到符号定义所在文件(command+单击)时,若按下option键,则在辅助窗口打开。
  • Double Click Navigation:Uses Separate Tab。双击打开Project Navigator中指定的文件或跳转到符号定义所在文件(command+双击)时,新建标签页

(4)SCM(Preferences->Source Control)

  • Enable Source Control:启用/禁用Xcode自带Source Control Manager(SCM)。
  • Comparison View:Show local revision in [Right] Side。打开version editor比较窗口时,左侧显示服务器基线版本(base),[右侧]显示本地修改过的工作拷贝(local working copy)。

(5)SDK/SimulatorPreferences->Downloads

Downloads:可下载Components(SDK&Simulator)和Documentation。

(6)构建输出目录(Preferences->Locations->Locations)

  • 当选择为Default时,Derived Data的目录为~/Library/Developer/Xcode/DerivedData。
  • 当选择为Relative时,Derived Data的目录为当前*.xcodeproj所在的目录。
  • 当选择为Custom时,Derived Data的目录需自定义。
不建议使用绝对路径,因为写死之后,换环境或换平台,又要重新修改路径,且同名project target的build folder会覆盖,建议使用相对路径(Relative

3.代码阅读

(1)Help

option+点按:查看选中符号的帮助提示(Quick Help for Selected Item)。

option+双击:打开选中符号的帮助文档。

(2)View Navigator

command+0:Show/Hide left tool panel(Navigator Area)

command+1-8:Project/Symbol/Find/Issue/Test/Debug/Breakpoint/Report Navigator

option+command+0Show/Hide right tool panel(Utility Area)

option+command+1/2:show the file/quick help inspector

可按下command+0隐藏左侧栏Navigator,再按下option+command+0隐藏右侧栏Utility,只显示Standard/Primary Editor,聚焦有效利用屏幕进行编码。

(3)View Editor Organization

control+1:Show Related Items(例如Superclasses/SubclassesCallers/CalleesProtocol Implementor/Implemented、Includes/Included By)。可输入实时搜索匹配。

control+2/3:Show Previous/Next History。可输入实时搜索匹配。

control+4:Show Top Level Items。
control+5:Show Group Files(当前文件夹内的所有文件)。可输入实时搜索匹配。

control+6:Show Document Items(当前文件的Symbols)。可输入实时搜索匹配。

(4)Eidtor Window/Tab Switch

command+shift+[/]:切换标签页

单/双指左右滑动(control+command+←/→):在单标签页打开的多个文件间切换(Go Back/Forward)

(5)Symbol Jump

command+L跳转到指定行。

shift+command+O:Open Quickly,快速全局查找文件、符号,非常常用!

command+点击Editor中选中的符号:跳转到符号定义(jump to definition)。

control+command+J:跳转到指定符号的定义处或实现处(Go to Declaration/Definition)。有时工程正在Loading、Indexing或Processing files时,“command+点击”无法响应,此时可试试control+command+J

control+command+↑/↓:切换头文件/实现文件(switch between a source file (.m,*.mm,*.cc) and the associated header file(.h),Jump to Previous/Next Counterpart)。

在Project Navigator中选中文件右键或通过菜单“File->Show in Finder”:在Finder中定位该文件。

(6)Symbol Navigator

command+2可聚焦左侧导航栏中的符号导航器。

  • filter0:底部编辑框输入符号(show symbols with matching name)= filter1 result+filter3 result
  • filter1:show only class and protocol symbols (hide other global symbol types),包括project和system层次。
  • filter2:show only project-defined symbols,过滤显示当前工程中的符号。filter2的结果是filter1的子集,较常用。
  • filter3:show only containers(hide members),过滤显示包含该单词的符号。
注意control+6只列出当前代码所在interface的符号,而Symbol Navigator是当前工程(Project Scope)的所有符号列表的Hierarchy,符号种类包括 Classes Protocols Functions Structs Unions Enums Types Globals
编辑器中光标所在符号处,Navigate菜单或右键快捷菜单可[Reveal in Symbol Navigator],在符号导航器中定位当前符号,亦可查看当前符号所属类的层次。

(7)Code Folding

option+command+←/→:折叠当前代码块,包括 @interface …@end @implementation …@end

option+shift+command+←/→:折叠该文件内所有代码块(方法/函数:Methods&Functions }

control+shift+command+←/→:折叠当前注释块(/*Comment Blocks*/

(8)Focus Switch

(shift+)option+command+`:MoveFocus to (Previous)Next Area.

command+J:焦点切换(Move Focus),可配合鼠标和方向键。带‘+’的“Move focus to a new assistant editor”可以快速在辅助编辑窗口中打开头文件(*.h)/实现文件(*.m,*.mm)。

shift+command+J:在项目导航中定位当前编辑其中打开的文件(Reveal in Project Navigator)。

4.代码编辑

(1)File | New

control+command+N:File | New | Workspace

shift+command+N:File | New | Project

(2)Text Editing

command+X/C/V:剪切/复制/粘贴

command+Z(+shift):撤销(重做)/Undo(Redo)

command+[/]:向前/向后缩进(Shift Left/Right)

option+command+[/]:将当前光标所在行代码上移/下移一行(Move Line Up/Down)

command+/:以双斜杠(//)注释选中的代码,再此按下可取消

Parentheses/Brackets/Braces Matching:双击某个分隔符(如()、[]、{} 等),Xcode会选中匹配代码块

Editor→Structure→Balance Delimiter:根据当前光标代码所在位置,自动向外扩展选择外层代码块。

(3)Auto Completion

esccontrol+.)就当前输入上下文呼出/隐藏智能提示列表(Auto Completion List);

上下方向键↑/↓)在智能提示列表中选择选项。当然,也可以用control+.;enter选中列表中备选的消息符号;

tab在輸入符号不完整时可一截一截匹配;选中消息符号后,tab可在各个参数占位符之间移动enter可选中参数占位符先临时补位填充。

输入Objective-C对象及消息名,然后输入 ],自动补充对象名左侧的,完成中缀符(infix natation)包围。

(4)Find菜单(control+单击)

当鼠标定位或选中某个符号时,可呼叫右键快捷菜单
  • Find Selected Text in Workspace:在当前工作空间查找选中文本或光标所在行的OC冒号分割方法名。
  • Find Selected Symbol in Workspace:在当前工作空间查找选中文本符号或光标所在行的OC冒号分割方法符号。
  • Find Call Hierarchy:查找选中文本符号或光标所在行的OC冒号分割方法符号的调用着(Callers)。
对应Find菜单中有Find Selected Text in Project、Find Selected Symbol in Projectcontrol+shift+command+F)、Find Call Hierarchy(control+shift+command+H
说明:Find Call Hierarchy等效于control+1|Callers。

(5)Find & Replace

command+F:当前文件查找。

shift+command+F(command+3):在Find Navigator中全局查找。可在[Preferences-General]中设置Find Navigator Detail的显示行数(当Navigator Area较窄挤压时)。

  • Find:可指定查找内容(Text/References/Definitions/Regular Expression);
  • 放大镜:下拉可查看最近查找历史;
  • In Project:查找范围(可指定Group);
  • Text:匹配规则(可指定Containing,Matching,Starting with,Ending with);
  • Case:是否区分大小写(可指定 Matching/Ignoring)。
对于查找出来的结果可以delete删除非预期干扰结果条目,也可以多择或全选Find Results拷贝出来整理分析。
option+command+F :当前文件替换。

option+shift+command+F:在Find Navigator中全局替换。

  • Replace:逐个替换;
  • All:所有替换;
  • Done:替换完成。

(6)Copy Symbol

例如,光标停留在NSMutableArray的insertObject:atIndex的前半截单词insertObject上时:

有三种复制方式:
  • command+CCopy(光标所在位置的单词):insertObject
  • control+shift+command+CCopy Symbol Name(光标所在位置的消息符号名称):-insertObject:atIndex:
  • option+control+shift+command+CCopy Qualified Symbol Name(光标所在位置的消息符号全名,带所属类名):-[NSMutableArray insertObject:atIndex:]
通过后两种快捷方式,可以便捷地复制Objective-C特殊的冒号分隔的消息符号名称。

(7)Open with External Editor——SublimeText

<1>在左侧导航栏(Project Navigator)中选中某个文件右键快捷菜单中有【Open with External Editor】,默认呼叫Mac OS X自带的文本编辑器(TextEdit)打开。我们可以按照以下步骤设置快捷键:
  • 【系统偏好设置(System Preferences)->键盘(Keyboard)->快捷键(Shortcuts)->应用快捷键(App Shortcuts)】,
  • 点击+号,选择应用程序【Xcode.app】
  • 准确填写[菜单标题],即菜单命令名称【Open with External Editor】,聚焦[键盘快捷键]编辑框时,同时按下想要设置的组合键即可,例如option+command+O(⌥⌘O)。
可针对Xcode工程代码文件(*.h/*.hh/*.c/*.cc/*.m/*.mm)设置默认打开程序为Sublime Text.app:右键Get Info(command+I),Open With选择Sublime Text.app并且Change All。 然后,Xcode|Open with External Editor将在Sublime Text打开选中文件。
<2>另外,可下载安装OpenInSublimeText插件,支持呼叫SublimeText打开Xcode当前正在编辑的文件。
  • 从github下载打开OpenInSublimeText.xcodeproj工程进行编译(command+B),生成的插件OpenInSublimeText.xcplugin将被集成到Xcode插件目录(~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins)下。
  • 重启Xcode将警告提示Unexpected code bundle "OpenInSublimeText.xcplugin",忽略警告选择[Load Bundle]即可。
  • Xcode Editor菜单中将新增[Open In Sublime Text]项,可设置其快捷键位为shift+command+S(⇧⌘S)。

5.辅助编辑(Assistant Editor)

(1)打开/关闭辅助编辑窗口

Assistant Editor有点类似VC中的Code Definition Window,可实现分屏查看代码Counterpart,方便交叉参考代码编辑。

  • option+command+enter/,打开Assistant Editor。
  • command+enter关闭Assistant Editor。

可通过菜单[View|Assistant Editor]设置Assistant Editors的方向,例如On Right。

(2)呼叫辅助编辑窗口(option+)

在Mac OS X日常操作中,我们已经认识到option这把单刀双掷开关的妙用:按住鼠标移动或三指触控移动时,按下option键可实现竖直块选调节音量/亮度时,按住optionshift 可以四分之一单位微调

使用Xcode快捷键进行切换或跳转动作时,若同时按下option可以在辅助编辑窗口中打开相应文件或符号(For optional navigation (Option-clicking or Option-choosing a file), opens the file in a new Assistant editor pane.)。若在辅助窗口中操作,则在主窗口(Standard Editor)中打开。

  • option+点击Project Navigator中选中的文件:在辅助编辑窗口中打开选中文件。
  • option+command+点击Editor中选中的符号在辅助编辑窗口中打开符号定义(jump to definition in assistant editor)。
  • option+control+command+↑/↓在辅助窗口中打开对应的头文件(*.h)/实现文件(*.m,*.mm,*.cc)。

点击查看shift+command+Oshift+command+F(command+3)选中的文件或符号时,可同时按下option在辅助编辑窗口中打开。

control+1~6中打开选择结果时,均可同时按下option在辅助编辑窗口中打开。

(3)导航窗格(option+shift+)

在Xcode以上种种切换跳转操作时,按下option的同时按下shift,通常会呼出一个导航窗格(option+command+<),可选择在new window/tab/assistant-editor打开显示。

For Option-Shift navigation (Option-Shift-click or Option-Shift-choose a file), Xcode displays a graphical navigation chooser showing the current layout. The chooser prompts you to open the file in any open editor pane in any window and tab, or to open the file in a new editor pane, window, or tab.


6.环境变量(Build Setting Macros)

(1)查看环境变量宏

命令行进入HelloWorld工程目录,执行xcodebuild命令并带上“-showBuildSettings”参数:

xcodebuild -project HelloWorld.xcodeproj -target HelloWorld -configuration Debug -showBuildSettings > xcodebuild_showBuildSettings.txt

则xcodebuild_showBuildSettings.txt中保存了Build settings for action build and target "HelloWorld”,其中dump了所有的环境变量。

(2)Xcode5(Mac OS X 10.9)的部分环境变量

约定1:~=当前账户的HOME目录,例如“/Users/faner”。

约定2:build构建基础路径:BUILD_PATH = ~/Library/Developer/Xcode/DerivedData/Build。可通过“File->Project Settings”查看Derived Data Location

约定3:环境变量宏(Build Setting Macros)引用格式:${MACRO},同Build Phases Run Script中的语法。

下面是摘选自xcodebuild_showBuildSettings.txt的部分常用环境变量。

(a) ARCH & PLATFORM & SDK

ARCHS = i386

CURRENT_ARCH = i386

PLATFORM_DIR = /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform

PLATFORM_NAME = macosx


SDKROOT = /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk

SDK_DIR = /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk

SDK_NAME = macosx10.9

(b) PROJECT & SOURCE

PROJECT = HelloWorld

PROJECT_DIR =~/Projects/Learn Objective-C/HelloWorld

PROJECT_FILE_PATH =${PROJECT_DIR}/HelloWorld.xcodeproj

PROJECT_NAME = HelloWorld

SOURCE_ROOT =${PROJECT_DIR}

SRCROOT =${PROJECT_DIR}

(c) BUILD & CONFIGURATION

BUILD_DIR =BUILD_PATH/Products

BUILD_ROOT =BUILD_PATH/Products

BUILT_PRODUCTS_DIR =BUILD_PATH/Products/Debug

CONFIGURATION = Debug

CONFIGURATION_BUILD_DIR =BUILD_PATH/Products/Debug

CONFIGURATION_TEMP_DIR =BUILD_PATH/Intermediates/HelloWorld.build/Debug

(d) PRODUCT & TARGET

PRODUCT_NAME = HelloWorld

PRODUCT_TYPE = com.apple.product-type.tool// Project Template: Command Line Tool

TARGET_BUILD_DIR =BUILD_PATH/Products/Debug

TARGET_NAME = HelloWorld

(3)设置环境变量

Product -> Edit Schemeoption+command+R)->Arguments->Environment Variables中可以添加自定义环境变量(Name为名称,Value为值)。

在Xcode|Build Phases中Add Run Script Build Phase的Run Script将会使用到环境变量。

7.构建配置

(1)Target & Scheme

一个Target是指在一个Project中构建的一个产品,它包含了构建该产品的所有文件,以及如何构建该产品的配置。
一个定义好构建过程的Target成为一个Scheme,可在Scheme中定义Target的六种构建过程:Build/Run/Test/Profile/Analyze/Archive。

  • Run 为编译运行调试;
  • Build 为只编译不运行;
  • Analyze 用于进行静态代码分析,可检测潜在的内存泄露(不对称 retain/release 导致的 Potential Leak)或野指针(Use of memory after it is freed)问题。编译时可选择 Build Configuration 为 Debug 沿用证书配置;
  • Profile 将调起 Instruments 工具进行动态代码分析,例如 使用 Allocations/Leaks 动态跟踪分析内存泄露。编译时可选择 Build Configuration 为 Debug沿用证书配置;
  • Test 用于运行测试,模拟器会启动并执行测试套件;
  • Archive 可以Export as Xcode Archive,然后将 .archive 中的 .app 拖入 itunes 可 打包生成 ipa 包

Product ->Edit Scheme(编辑配置,快捷键为 option+command+R 或 shift+command+,/command+<)->Manage Schemes可对Scheme的六种构建过程进行配置(可配置项包括Info、Arguments、Options)。

在 Project Navigator 中选中某个 xcodeproj(例如 QQ.xcodeproj),将进入 Project Setting 页面,可点击左侧图标 show/hide project and targets list:

点击 targets 项可分别设置各 target 的 Build Settings;右击可对 target 进行 delete。

(2)Build Settings

Architectures:Supported Platforms(OS X、iOS),Base SDK,(Valid)Architectures(armv7、arm64、i386)。

  • Build Active Architecture Only:一般Debug会选择YES,表示只是编译连接调试的目标真机对应的CPU指令集;对于Release Archive版本,需要选择NO,这样编译出来的安装包才能同时支持在armv7、arm64机型上安装。

Build Locations:配置构建目录,包括Intermediate Build Files Path、Build Products Path及其针对Per-Configuration的配置。

Build Options
  • Compiler for C/C++/Objective-C默认时Apple LLVM 7.0;
  • Debug Information Format:真机连接调试时,可断点定位跟踪调试,可选择DWARF以加快编译速度;但是真机断开Xcode运行出现crash时,没有调试符号将无法逆向解析定位出问题的代码符号及其所在具体位置,故一般要选择DWARF with dSYM File
  • 此外还包括Bitcode和Testability两个使能开关。
Code Signing:包括Entitlements、Identity和Provisioning Profile,详情参考《iOS Provisioning Profile(Certificate)与Code Signing详解》。

Deployment:配置发布及安装选项。

Linking

  • Dead Code Stripping:一般对Debug关闭,对Release版本开启以去除无效路径僵尸代码,压缩安装包体积。
  • Display Mangled Names(LINKER_DISPLAYS_MANGLED_NAMES):针对C++ symbols,ld --no-demangle链接开关,一般选择NO。
  • Mach-O type:Static Library、Dynamic Library、Executable、Bundle、Relocatable Object File(Position-Dependent )。
  • Other Linker Flags:例如fobjc-arc(可在Build Rules中针对单个文件配置ARC开关)、-force_load。
  • Write Link Map File:写LinkMap文件。
  • Path to Link Map File:指定链接LinkMap文件路径。

Packaging

  • Info.plist File:指定plist文件,对应顶部Info标签。
  • Product Name:为应用名称,例如QQ。
  • Wrapper Extension:为应用扩展,例如app。

Search Paths

  • Info.plist File:指定plist文件,对应顶部Info标签。
  • Framework Search Paths: *.framework搜索路径。
  • Header Search Paths:*.h/*.hh头文件搜索路径。
  • Library  Search Paths:静态库、动态库搜索路径。

Apple LLVM 7.0配置
⭐️Code Generation:

  •     Generate Debug Symbols:YES
  •     Optimization Level:优化级别,-Os
⭐️Custom Complier Flags:
⭐️Language
  •     language-Objective-C:Objective-C Automatic Reference Counting,ARC开关。
⭐️Preprocessing:定义Preprocessor Macros,例如DEBUG、NDEBUG=1。
⭐️Warning Policies:例如可以提高警告级别当作错误(Treat Warnings as Errors:YES)。

(3)Build Phases

Target Dependencies:设置依赖target。

Copy Bundle Resources:拷贝的资源文件。

Compile Sources:该target需要编译的源代码文件。可输入搜索源代码文件名(xxx.mm),查看或编辑其编译选项(Compiler Flags),例如 -fobjc-arc 表示 ARC(__has_feature(objc_arc))。

Link Binary with Libraries:需要链接的库(*.a、*.framework)。

Embed App Extensions:该APP对应的扩展插件。

可以点击加号,New Run Script Phase,配置custom actions after compiling the Xcode project,相当于Visual Studio的Post-builtstep。

当然,也可以在Edit Scheme中设置Pre-actions(custom actions after compiling the Xcode project)、Post-actions(将在编译链接完成后执行脚本)。

以下Shell脚本将生成的二进制(Unix executable)文件HelloWorld拷贝到~/Software,然后cd到该目录下并执行HelloWorld:



(4)Build

shift+command+K:清除products|debug或release下的Unix executable文件。

option+shift+command+K:删除构建目录(Delete/Clean Build Folder),清理Derived Data对应target目录下的Build文件夹(包括intermediate和products)。通常用于重新编译整个工程,尝试解决增量编译时部分符号陈旧导致链接不通过的问题

Product -> Edit Schemeoption+command+R)->Info->Build Configuration:选择生成版本(Debug or Release)

command + B:构建(Buid)

command+8可聚焦左侧导航栏中的日志报告导航器,其中可以查看Build日志。

(5)Issue & Errors

command+4可定位Issue Navigator:

当编译错误(error)和警告(warning)过多时,点击底端的感叹号,即可忽略编译警告,只显示编译错误

(6)Run

command + R:运行(Run),可能会重新编译链接。

option+command + R:如果确定代码没有改动,加option键可免重新编译链接,直接运行上次build成功的product(Run Without Building)。

command + .:停止运行(Stop)。

(7)Devices & Destination

定义好Target构建配置后,接下来需要指定目标机编译。

shift+command+2:可以查看当前连接的Device和支持的Simulator。

control+option+command+[/]:Select Previous/Next Destination,在连接多个真机或模拟器之间切换。


目标机的iPhoneOS.platform必须>=Deployment Target,且Xcode必须支持该机型:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/目录下必须含有对应iOS系统版本的DeveloperDiskImage.dmg,否则真机编译会提示Could not find developer disk image。


最新的 Xcode 8 最低支持 iOS 8.0,如果连接的设备运行 iOS 7 则无法编译,则提示:

[plain]  view plain  copy
 print ?
  1. Could not locate device support files.《This iPhone 5 (Model A1429) is running iOS 7.0.4 (11B554a), which may not be supported by this version of Xcode.》  
可以将 Xcode 7 中的 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport 中的 7.0、7.1 的DeveloperDiskImage(DeveloperDiskImage.dmg & DeveloperDiskImage.dmg.signature)拷贝到 Xcode 8 对应目录,然后 在项目配置  General | Deployment Info | Deployment Target  硬性填写  7.0 ,即可在 Xcode 8 中调试 iOS 7 真机设备。


8.运行调试

(1)Console

shift+command+Y:显示控制台(Show/Hide the debug area

shift+command+C:激活聚焦控制台,光标定位到控制台呈可输入状态

command+K:清除控制台(Debug->Debug Workflow->Clear Console)

可安装BBUDebuggerTuckAway插件,在打字coding时,自动隐藏调试控制台

(2)Breakpoint

command + \:当前行设置/取消断点;通过鼠标点击边列中的蓝色断点来启用/禁用当前行断点。

command + Y:全局激活或禁用所有的断点,激活进入调试模式(此时断点蓝色可见)。

边列(Gutter)中的断点/警告可右键呼出Reveal in Breakpoint/Issue Navigator。

trick:编辑断点(Edit Breakpoint):

Condition:设置断点的触发条件,例如“i==3”(注意不能有空格)表示当i等于3时该断点才会被触发。

Ignore:设置断点需要被忽略多少次才会中断,若设置成5则表示第6次遇到该断点时才触发。

Action:设置断点触发时的动作,可以为Debugger Command、Log Message、Shell Command或Sound。

例如可设置以下Debugger Command:

[1]读取std::string sig的内存buffer值:mem read sig.c_str() -c sig.size()

[2]打印NSData实例sig:po sig

(3)Debug

F6:下一步(Step Over),逐过程单步调试,不进入函数体。

(fn+)F7:进入(Step Into)函数体。可能与多媒体键有冲突,故需要fn辅助(建议将功能键F1-F12设置为标准的功能键)。

(fn+)F8:跳出(Step Out)函数体。可能与多媒体键有冲突,例如呼叫iTunes,故需要fn辅助。

control+command+Y:逐断点继续执行(Pause/Continue)。

control+command+C:执行到当前光标所在行(Continue to current line)。

trick:移动指令指针(Move the instruction pointer):

断点调试运行时,可以将绿色指针箭头(Line 47)移动到其他行(Line 49)或其他断点(Line 51)实现跳转执行。


command+8可聚焦左侧导航栏中的日志报告导航器,其中可以查看Debug日志。

(4)Watch

shift+command+M:Debug Workflow->View Memory

Debug Workflow->Show Disassembly When Debugging,可进行汇编指令级调试。

trick:修改变量内存值(change memory value while debugging):

调试运行时,可以在底部的调试窗口(Debug Area,可通过Shift+Command+Y呼出)右键某个变量,除了可以进行View Memory/View Value As之外,还可以选择Edit Value运行时编辑内存变量的值。

在调试验证某些难以复现的bug或进行边界测试时非常有用,可减少每次修改测量样本值(hardcode)重新编译链接的痛苦。

(5)lldb调试命令

  • n/next:step over,等效于F6;
  • s/step:step into,等效于(fn+)F7;
  • finish:step out,等效于(fn+)F8;
  • c/continue:goto next breakpoint,等效于^⌘Y
  • expr/expression:Evaluate a C/ObjC/C++ expression(动态执行C/ObjC/C++表达式);
  • p/print/expr/expression:print as a C/C++ basic variable;
// 打印SYSTEM_VERSION(可能要加UIDevice*转换
(lldb)p [[[UIDevicecurrentDevicesystemVersion] doubleValue]
  • po/expr -O/expression -OPrint as an Objective-C object;
// 打印屏幕bounds(可能要加UIScreen*转换
(lldb)po NSStringFromCGRect([[UIScreen mainScreen] bounds]) 
// 打印状态栏frame(可能要加UIApplication*转换
(lldb)po NSStringFromCGRect([UIApplication sharedApplication].statusBarFrame)
// 打印当前keyWindow的根视图(可能要加UIViewController*转换
(lldb)po [[[UIApplication sharedApplication] keyWindow] rootViewController]
  • call:调用。其实上述p/po后接表达式(expression)也有调用的功能,一般只在不需要显式输出,或是无返回值时使用call,用于动态调试插入调用代码。
    例如可以在viewDidLoad:里面设置断点,然后在程序中断的时候输入以下命令:
// 调用后,继续运行程序,view的背景色将变成红色
(lldb) call [self.view setBackgroundColor:[UIColor redColor]]
  • bt(backtrace),打印当前调用堆栈(crash堆栈),“bt all”可打印所有thread的堆栈(相当于command+6的Debug Session Navigation)。
  • image:可用于寻址,有多个组合命令,比较实用的一种用法是寻找栈地址对应的代码(行)位置。
    例如某个UITableView总共有2个section,当其引用的currentSection.index≥2时将会引起[UITableView rectForHeaderInSection:]调用异常,可使用expr动态改值制造crash场景模拟调试。
    此时crash时的控制台bt显示异常出现在应用层代码“0x00d055b8 - [FACategoryTableView FACategorySectionHeaderDidTouched:] + 744”处(其中0x00d055b8为当前栈(代码段)偏移量,744为栈帧偏移量——PC指针相对函数入口的偏移)。
    那么具体是FACategoryTableView.m文件哪一行代码调用引起的异常呢?此时通过“image lookup --address”后接bt的call stack中的代码段偏移地址(0x00d055b8)即可定位出异常调用的代码行位置。
  • x/memory read:dump指定地址的内存(Read from the memory of the process being debugged),后接起止地址或-c指定count加起始地址。可help mem read查看帮助:

Syntax

memory read []

Command Options Usage:

size指定内存块(block/chunk)的大小

    --size ):The size in bytes to use when displaying with the selected format.

count指定内存块(block/item)的个数,可配合起始地址使用。

    -c ( --count ):The number of total items to display.

format指定内容显示格式,格式符同print:c-char,s-string,d-decimal,x-hex。

    -f ( --format ):Specify a format to be used for display.

Command Samples:

(a)起止地址,以下基于起始地址偏移量指定截至地址。

(lldb)mem read 0x10b88f0c 0x10b88f0c+9

0x10b88f0c: 39 38 37 36 35 34 33 32 31                       987654321

(b)可在起始地址后使用-c指定需要dump的字节数,以上等效:

(lldb)mem read 0x10b88f0c -c 9

0x10b88f0c: 39 38 37 36 35 34 33 32 31                       987654321

(c)起始地址+内存块size+内存块count(dump hex format)

(lldb)memory read -s 1 -f x -c 9 0x10b88f0c

0x10b88f0c: 0x39 0x38 0x37 0x36 0x35 0x34 0x33 0x32

0x10b88f14: 0x31

说明:dump的memory chunk为1byte,以上总共dump了chunk size*chunk count=9byte。

(d)起始地址+内存块size+内存块count(dump char format)

(lldb)memory read -s 1 -f c -c 9 0x10b88f0c

0x10b88f0c: 987654321

(e)起始地址+内存块size+内存块count(dump string format)

(lldb)mem read 0x10b5cf2c -f s -c 1

0x10b88f0c: "987654321"

(f)起始地址+内存块size+内存块count(dump int format)

(lldb)memory read -s 4 -f x -c 3 0x10b88f0c

0x10b88f0c: 0x36373839 0x32333435 0x109f0031

说明:以上指定chunk尺寸为4byte(-s  4),chunk数量为3,共dump了12个byte。

  • memory write:改写指定地址的内存(Write to the memory of the process being debugged)。可自行help mem write查看帮助:

Syntax: memory write

[ [...]]

trick:lldb打印无效问题

在使用LLDB调试命令p/po打印C类型(包括复合类型)或Objective-C对象时,可能会遇到属性不存在或类型不匹配的问题。

例1——断点调试,打印当前UIViewController的frame:

  • 由于Xcode lldb本身的bug,对属性的点引用有时会无法识别,例如执行(lldb) p self.view.frame报错:property 'frame' not found on object of type 'UIView *'
  • 将对属性的点引用改为对属性的getter调用,执行(lldb) p [self.view frame]依旧报错:no known method '-frame'; cast the message send to the method's return type
  • 由于Xcode lldb本身的bug,对返回的复合类型也无法直接识别,此时可采用显示类型转换,执行(lldb) p (CGRect)[self.view frame]不会报错!

例2——断点调试,打印当前UIViewController的navigationController堆栈和childViewControllers数组

点引用报错写法(property not found):(lldb) po self.navigationController.viewControllers

调用getter正确打印:(lldb) po [[self navigationController] viewControllers]

点引用报错写法(property not found):(lldb) po self.childViewControllers

调用getter正确打印:(lldb) po [self childViewControllers]

(6)启用NSZombieEnabled调试EXC_BAD_ACCESS

当你对已释放的对象发送消息(90%的可能是对引用计数为0的对象再release)或release那些autorelease对象时,就会出现报EXC_BAD_ACCESS这样的错误。
默认设置下 Xcode不会给你定位具体是哪一行代码不该去使用已释放的对象,或者release用错了。
Product -> Edit Schemeoption+command+R -> Diagnostics ,勾选“Objective-C”之后的“Enable Zombie Objects”。
设置NSZombieEnabled环境变量后,一个对象销毁时会被转化为_NSZombie;设置NSZombieEnabled后,当你向一个已经释放的对象发送消息,这个对象就不只是报EXC_BAD_ACCESS Crash,还会放出一个错误消息,然后以一种可预测的可以产生debug断点的方式消失, 因此我们可以找到具体或者大概是哪个对象被错误的释放或引用了。
注意:NSZombieEnabled只能在调试的时候使用,千万不要忘记在产品发布的时候去掉,因为NSZombieEnabled不会真正去释放dealloc对象的内存,一直开启后果自负!


参考

《Xcode Overview-About Xcode》《Xcode Keyboard Shortcuts and Gestures

《Xcode Key Bindings & Gestures》《提升Xcode效率的小技巧》

《Xcode5.1离线安装》《Xcode插件》

《用Vim编辑器辅助Xcode》《Vim命令图解和xVim使用》《升级Xcode7后XVim插件失效的修复办法》


《Xcode的文件组织》《Xcode设置命令行启动参数》

《Xcode环境变量及路径设置》《Xcode构建输出目录》

从VC到Xcode》《workspace & subProject & target


Xcode创建静态库》《Xcode4制作静态库  1》《Xcode4制作静态库 2》

《Xcode4.3下制作framework》《Xcode添加依赖的静态库工程》

《Building static libraries with the iPhone SDK》《Static Libraries and Cross-Project References》


《iOS开发之统计Xcode代码行数》《Start Developing iOS Apps Today

《使用Xcode创建Hello World项目》《使用Xcode5和Interface Builder创建Hello World App》


《LLDB Quick Start Guide》《LLDB to GDB Command Map》《Xcode gdb/lldb调试命令》

《Xcode LLDB Debug教程》《LLDB调试命令初探》《iOS应用崩溃日志揭秘》《经营你的iOS应用日志》

《让lldb提升你的效率》《iOS/OSX 调试:跳舞吧!与LLDB共舞华尔兹》《NSLog效率低下的原因及尝试lldb断点打印Log》








一   XCODE工程或IDE里面各类文件和文件夹详解


在iOS多人协同开发时,一般会使用版本管理工具,比如SVN/Git。 
经常的,在提交修改的时候,除了我们自己主动修改的.h、.m和资源文件之外,还会出现一些莫名其妙的文件,在.xcodeproj里面,如下图: 
xcode各项配置详解_第1张图片

.xcodeproj是项目文件,包含项目配置文件,这是很多人都知道的。然而,.xcodeproj里面的各个文件都有什么用呢?提交版本时,要不要提交这些文件/目录?下面总结一下。

一个xcodeproj文件,其实是一个目录,它的格式大体上是这样的: 
xcode各项配置详解_第2张图片

有的文件,比如user.mode1v3,在没有多个用户操作项目的时候,是没有的。Apple并没有提供.xcodeproj文件的文档,而且它也没有准备提供,更坑爹的是,xcodeproj的格式、内容都是随时可变的,比如一个Xcode版本上来,可能其目录就会变化,而没有任何通知。这可苦了那些为.xcodeproj开发每三方库的同学,不仅要一点一点摸索各个文件的内容,修改方法,还要忍受Apple没有任何通知地修改格式。Stackoverflow中这位就在抱怨苹果开发人员的傲慢:http://stackoverflow.com/questions/49478/git-ignore-file-for-xcode-projects/12021580#12021580 
闲话少说,下面进入正题:各个文件/目录的作用,以及要不要提交更新。

1.1  project.pbxproj文件 

  1. 这个文件包含了所有此项目build需要的元数据,setting、file reference、configuration、targets…也就是说,这个文件代表的就是这个project。 
    因此,在修改了这个文件之后,需要提交上去。

    project.pbxproj 文件是 ProjectName.xcodeproj 包里面的一个配置文件,我们修改 Project 和 target 里面的配置,实际上就是修改了 project.pbxproj。

    一个 Xcode 的 project.pbxproj 文件是由一个 24 位的 UUID 标识的对象值。

    project.pbxproj 里面的每一种元素类型都是由 isa 来标识的。

    project.pbxproj 文件结构

    [Objective-C] 查看源文件 复制代码
    ?
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    // !$*UTF8*$!
     
        {
            archiveVersion = 1;
            classes = {
            };
            objectVersion = 45;
            objects = {
            ...
            };
            rootObject = 0867D690FE84028FC02AAC07 /* Project object */;
        }

    xcode各项配置详解_第3张图片



    1、XCConfigurationList

    编译配置列表

    示例:

    [Objective-C] 查看源文件 复制代码
    ?
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    DE218BE11BDB7AA7003717DF/* Build configuration list for PBXProject "ShareSDKDemo" */ = {
          isa = XCConfigurationList;
          buildConfigurations = (
              DE218C111BDB7AA7003717DF/* Debug */,
              DE218C121BDB7AA7003717DF/* Release */,
          );
          defaultConfigurationIsVisible = 0;
          defaultConfigurationName = Release;
      };
      DE218C131BDB7AA7003717DF/* Build configuration list for PBXNativeTarget "ShareSDKDemo" */ = {
          isa = XCConfigurationList;
          buildConfigurations = (
              DE218C141BDB7AA7003717DF/* Debug */,
              DE218C151BDB7AA7003717DF/* Release */,
          );
          defaultConfigurationIsVisible = 0;
          defaultConfigurationName = Release;
      };


    XCBuildConfiguration

    XCBuildConfiguration 元素定义了编译的配置

    示例:

    [Objective-C] 查看源文件 复制代码
    ?
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    870C88151338ABB600A69309/* Debug */ = {
        isa = XCBuildConfiguration;
        buildSettings = {
                .....
                PRODUCT_NAME = "$(TARGET_NAME)";
        };
        name = Debug;
    };
    870C88161338ABB600A69309/* Release */ = {
        isa = XCBuildConfiguration;
        buildSettings = {
                .....
                PRODUCT_NAME = "$(TARGET_NAME)";
        };
        name = Release;
    };



    2、PBXGroup

    PBXGroup 这个元素下面包含了Xcode 工程的文件目录。在Xcode 文件体系里面,是使用 Group 组织管理的。

    示例:

    [Objective-C] 查看源文件 复制代码
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DE218BDD1BDB7AA7003717DF = {
        isa = PBXGroup;
        children = (
            DE218C251BDB8836003717DF/* ShareSDK */,
            DE218BE81BDB7AA7003717DF/* ShareSDKDemo */,
            DE218BE71BDB7AA7003717DF/* Products */,
        );
        sourceTree = "";
    };




    3、PBXNativeTarget

    示例:

    [Objective-C] 查看源文件 复制代码
    ?
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    DE218BE51BDB7AA7003717DF/* ShareSDKDemo */ = {
        isa = PBXNativeTarget;
        buildConfigurationList = DE218C131BDB7AA7003717DF /* Build configuration list for PBXNativeTarget "ShareSDKDemo" */;
        buildPhases = (
            DE218BE21BDB7AA7003717DF/* Sources */,
            DE218BE31BDB7AA7003717DF/* Frameworks */,
            DE218BE41BDB7AA7003717DF/* Resources */,
        );
        buildRules = (
        );
        dependencies = (
        );
        name = ShareSDKDemo;
        productName = ShareSDKDemo;
        productReference = DE218BE61BDB7AA7003717DF /* ShareSDKDemo.app */;
        productType = "com.apple.product-type.application";
    };



    PBXSourcesBuildPhase

    示例:

    [Objective-C] 查看源文件 复制代码
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    4DF8B22D1171CFBF0081C1DD/* Sources */ = {
            isa = PBXSourcesBuildPhase;
            buildActionMask = 2147483647;
            files = (
                    4DF8B23E1171D0310081C1DD/* test.mm in Sources */,
            );
            runOnlyForDeploymentPostprocessing = 0;
    };





    PBXFrameworksBuildPhase

    示例:

    [Objective-C] 查看源文件 复制代码
    ?
    1
    2
    3
    4
    5
    6
    7
    4D05CA2C119304BD00125045/* Frameworks */ = {
        isa = PBXFrameworksBuildPhase;
        buildActionMask = 2147483647;
        files = (
        );
        runOnlyForDeploymentPostprocessing = 0;
    };



    PBXResourcesBuildPhase

    示例:

    [Objective-C] 查看源文件 复制代码
    ?
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    8D1107290486CEB800E47090/* Resources */ = {
            isa = PBXResourcesBuildPhase;
            buildActionMask = 2147483647;
            files = (
                    535C1E1B10AB6B6300F50231/* ReadMe.txt in Resources */,
                    533B968312721D05005E617D/* Credits.rtf in Resources */,
                    533B968412721D05005E617D/* InfoPlist.strings in Resources */,
                    533B968512721D05005E617D/* MainMenu.nib in Resources */,
                    533B968612721D05005E617D/* TableEdit.nib in Resources */,
                    533B968712721D05005E617D/* TestWindow.nib in Resources */,
            );
            runOnlyForDeploymentPostprocessing = 0;
    };



    PBXShellScriptBuildPhase

    示例:

    [Objective-C] 查看源文件 复制代码
    ?
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    4D22DBAE11674009007AF714/* ShellScript */ = {
            isa = PBXShellScriptBuildPhase;
            buildActionMask = 2147483647;
            files = (
            );
            inputPaths = (
            );
            outputPaths = (
            );
            runOnlyForDeploymentPostprocessing = 0;
            shellPath = /bin/sh;
            shellScript = "./fix_references.sh";
    };




    PBXHeadersBuildPhase

    示例:

    [Objective-C] 查看源文件 复制代码
    ?
    1
    2
    3
    4
    5
    6
    7
    87293EBC1153C114007AFD45/* Headers */ = {
        isa = PBXHeadersBuildPhase;
        buildActionMask = 2147483647;
        files = (
        );
        runOnlyForDeploymentPostprocessing = 0;
    };




    参考文献

    1、Xcode 中的 workspace, project, target, scheme 译文 官文

    2、Xcode Project File Format link

    3、pbxplorer link


    1.2 关于 xcconfig 文件

    xcconfig 文件是一个用来保存 build setting 键值对的纯文本文件。这些键值对会覆盖 build setting 中的值。所以当你在 xcconfig 文件中配置了的选项在 build settings 中保持默认值就好了(因为是什么都不会起作用了)。

    创建 xcconfig 文件

    点击菜单 File > New > File...,在 iOS 的 Other 下面可以看到 Configuration Settings File,双击或者选中点下一步按钮创建一个文件,给这个文件命名并选择存储位置,然后点击创建就会发现文件创建好了,可以看到创建的文件格式是 .xcconfig 后缀的。

    我们一般按照下面的名称创建四个 xcconfig 文件:

    • Application.xcconfig target 相关配置

    • Shared.xcconfig Debug 与 Release 共用的配置

    • Debug.xcconfig Debug 独有的配置

    • Release.xcconfig Release 独有的配置

    xcconfig 文件的使用

    点击工程文件,切到 info Tab,定位到 Configurations 选项(实际上这个 tab 下的选项并不多,一眼就瞄到了),点开 Configurations 前面的小箭头,看到了分为 Debug 和 Release,分别点击 Debug 与 Release 选择对应的 xcconfig 文件(Debug 对应 Debug.xcconfig,Release 对应 Release.xcconfig)。然后 Debug 和 Release 的小箭头看到下面的 target,为 target 选择 Application.xcconfig。

    如此这般就可以使用 xcconfig 文件来解耦 project 文件中的 build settings 了。

    xcconfig的内容

    前面讲了 xcconfig 文件的创建与使用,还有一点重要的就是 xcconfig 中的内容怎么去填充?难道一个一个键值对去手写?当然不用如此笨拙。

    直接在 build settings 中选中你想要在 xcconfig 中配置的键值对所在行(当然也可以选多行),command + c 复制,然后到 对应的 xcconfig 中去粘贴就好了,就这么简单,记得在 build settings 中改为你想要的值后再复制,你一定会想那我不还得改回去吗?别急,还是选中这行,command + delete 就恢复默认值了,so easy。

    可以看一下我的 Shared.xcconfig 中的内容:

    而且,这个文件中还可以写注释。

    xcconfig 文件的包含引用

    你一定奇怪 Shared.xcconfig 怎么没用到?别急,前面提到 Shared.xcconfig 中放 Debug 与 Release 中共享的配置,对,那怎么共享呢?引用————跟代码引用一样:

    #include "Shared.xcconfig"
    

    当然,你现在肯定也明白了文件名是可以随便取的,文件也可以随意包含,没错,只要你有合理的组织结构。比如你想把签名相关配置独立出来,那么你把签名配置单独放到一个 xcconfig 文件中也是可以的,然后在需要的地方引用即可。

    所以,只要你理解了原理,你爱怎么玩就怎么玩。

    自定义的 build setting 键值对

    你可能注意到了我的 Shared.xcconfig 最后一行的键值对不是标准的 build setting 键值对,其实它们是一对自定义的键值对,我们也可以在 build settings 中看到我们自定义的键值对:

    自定义的有什么用呢?可以在一些预编译脚本中读取自定义的 build setting,有助于我们写出更高质量的脚本。关于预编译脚本我们在另一篇中去讲,本文不多讲,只是提一下。




  2. project.xcworkspace目录 
    这个文件比较特殊。 
    首先要了解的是workspace和project的概念。project应该比较清楚,那workspace是什么呢?workspace是一种Xcode documentation,可以将多个project和其它文件放到一起,这样可以work on them together。一个project也可以属于多个workspace。所以简单来讲,workspace里面就是一个或多个projects的reference,放在一起,有时候比较好工作。 
    这样的话,如果项目里面根本就没有workspace的概念,或者只有一个workspace+一个project,这个workspace并不会有什么变动,那这个文件就不需要提交同步。如果project很依赖workspace,没有workspace就运行不了,活不下去了,这时候这个文件肯定是要同步的。

  3. user.pbxuser文件 
    Xcode项目为每一个使用这个项目的用户创建一个user.pbxuser文件,存储了此用户对项目的偏好设置,如Xcode的位置和大小、文件书签等。可以看到这个文件是针对某个用户的,可以说是私人性质的,跟整个项目没有太大关系,所以一般不需要同步。

  4. user.mode1v3和user.mode2v3文件 
    这个也是用户相关的文件,和user.pbxuser差不多,存储某用户特定的项目设置,比如Xcode中window的状态和结构,断点等等。 
    因此也不需要同步。

  5. xcuserdata目录/xcshareddata目录: 
    大体上来说,和上面两种一样,也是用户相关的文件,包含user state,folders的状态,最后打开的文件等。因此一般来说是不需要同步的。 
    例外是,这个目录里也包含了scheme相关的内容。如果项目里需要同步特定的scheme,这时候,需要在Edit Scheme里,勾选Share框,然后把新生成的xcshareddata目录提交上去。

  6. .xccheckout 
    我没有碰到过这个文件。 
    这个文件在xcworkspace目录里。 
    .xccheckout文件包含了关于workspace中用到了什么repo的数据。 
    根据说明,它的规则和xcworkspace差不多:如果没用过,或者只是简单使用workspace,不需要同步;如果深入使用workspace,则需要同步。

总结1: 
.xcodeproj里的文件大体上有3种:

  • 项目文件
  • 单个用户的文件
  • 跟workspace相关的文件

项目文件,需要同步; 
单个用户的文件,不需要同步; 
跟workspace相关的文件,视有没有深入使用workspace而定。

总结2:

  1. 需要同步的文件:

    • project.pbxproj文件
    • xcsharedata目录
  2. 不需要同步的文件

    • user.pbxuser文件
    • user.mode1v3/user.mode2v3文件
    • xcuserdata目录
  3. 视workspace情况而定的文件:

    • .xcworkspace目录
    • .xccheckout文件

/Users/fishmai/Library/Developer/Xcode/DerivedData/Build/Intermediates/___PROJECTNAME___.build/Debug-iphoneos/___PROJECTNAME___.build/Objects-normal/armv7




二   xcode环境变量

假设一个 Project 的路径是 XXX/ProjectX

当 build 完成后,我们会关注 2 个与 Product Files 有关的 settings :

$BUILT_PRODUCTS_DIR 和 $TARGET_BUILD_DIR

这 2 个 settings 决定了我们 build 出来的 Products 被放置到了哪里。

官方解释

  • $BUILT_PRODUCTS_DIR:Directory path. Identifies the directory under which all the product’s files can be found. This directory contains either product files or symbolic links to them.

  • $TARGET_BUILD_DIR:Directory path. Identifies the root of the directory hierarchy that contains the product’s files (no intermediate build files).

乍一看好像都是用来存放 Product Files 的目录,但是它们的作用是不一样的:

刚编译完的时候,Xcode 会先把 Product Files 生成到 $BUILT_PRODUCTS_DIR 中,然后再根据具体的 configuration 来决定要不要对生成的 Product Files 进行 deploy,如果不需要 deploy,那么 Product Files 最后还是留在 $BUILT_PRODUCTS_DIR 中,如果需要 deploy,那么 Product Files会被 move 到 $TARGET_BUILD_DIR 中,而原来的 $BUILT_PRODUCTS_DIR 中就只有 symbolic links 了。

举个例子

普通的 app 在 build 完之后,一般放置在 $BUILT_PRODUCTS_DIR 中即可,而对于 Xcode Plugin 来说,在 build 完之后一般会直接将其 deploy 到 Xcode 的 Plug-ins 目录中,此时 $TARGET_BUILD_DIR就是 Plug-ins 目录,而 $BUILT_PRODUCTS_DIR 中只有 Plugin 的 symbolic links。

可以 clone 一下我之前写的一个小插件,build 一下看结果。


下面就看一下这 2 个路径是如何设置的

首先解释一些相关的 settings:

settingName (settingDisplayNameInXcodeBuildSettings)

  • $SRCROOTXXX/ProjectX

  • $SYMROOT (Build Products Path):Directory path. Identifies the root of the directory hierarchy that contains product files and intermediate build files. Product and build files are placed in subdirectories of this directory. 看完官方解释,我再说一下它具体如何设置。

    1. 默认值是 $SRCROOT/build

    2. 可以在 Xcode 的 Preferences 里面设置 Build Location,如下图
      Build Location

    3. 直接在 Target 的 Build Settings 里面设置 Build Products Path,如下图
      Build Products Path

    这 3 种设置的优先级依次递增,也就是说,如果你同时设置了 2 和 3,那么最后 build 是按照 3 的值来处理的。

  • $CONFIGURATION:Debug、Release、自定义的等等。

  • $CONFIGURATION_BUILD_DIR (Per-Configuration Build Products Path):= $SYMROOT/$CONFIGURATION,例如 XXX/ProjectX/build/Debug

  • $DEPLOYMENT_LOCATION (Deployment Location):Boolean value. Specifies whether product files are placed in the installation or the build directory. 它决定了要不要对 Product Files 进行 deploy。

  • $SKIP_INSTALL (Skip Install):Boolean value. Specifies whether to place the product at the location indicated by $DSTROOT or the uninstalled products directory inside the directory indicated by $TARGET_TEMP_DIR. 它决定了具体要把 Product Files deploy 到哪里。

下面就轮到 2 个主角了。

  • $BUILT_PRODUCTS_DIR:= $CONFIGURATION_BUILD_DIR = $SYMROOT/$CONFIGURATION (其实除了这个值,还有一种取值,不过基本不用,所以这里为了便于理解把它忽略了。详情可查阅官方文档)

  • $TARGET_BUILD_DIR

    1. 如果 $DEPLOYMENT_LOCATION = NO,即不需要 deploy,那么 $TARGET_BUILD_DIR就直接等同于 $BUILT_PRODUCTS_DIR

    2. 如果 $DEPLOYMENT_LOCATION = YES,即需要 deploy,那么:

    2.1. 如果 $SKIP_INSTALL = NO,那么 $TARGET_BUILD_DIR = $INSTALL_DIR = $DSTROOT/$INSTALL_PATH。其中,$DSTROOT 的 display name 是 Installation Build Products Location$INSTALL_PATH 的 display name 是 Installation Directory。另外需要注意,为了拼接出一个有效的 $INSTALL_DIR$INSTALL_PATH 必须以 / 开头。

    2.2. 如果 $SKIP_INSTALL = YES,那么 $TARGET_BUILD_DIR = $TARGET_TEMP_DIR/UninstalledProducts

    一般需要 deploy 的时候,都是设置 $SKIP_INSTALL 为 NO,然后设置具体的 $DSTROOT 和 $INSTALL_PATH,所以这里忽略对 $TARGET_TEMP_DIR 理解。








三   xcode工程详细配置

Key:
Application can be killed immediately after launch
(NSSupportsSuddenTermination)
Value:BOOL

说明:

        指定应用程序是否可以被杀死,以便更快地关闭或注销操作。

        表示系统是否可以彻底杀死的应用程序以注销或关闭更迅速。您可以使用此键来指定应用程序是否可以在关闭后立即被杀死。该应用程序还可以启用或禁用终止在运行时使用NSProcessInfo类的方法。默认值为NO。

 

Key:
Application Category
(LSApplicationCategoryType)
Value:String

说明:

         包含UTI相应的应用程序的类型。 App Store中使用该字符串的应用程序,以确定适当的分类。

UTIs for app categories

Category

UTI

Business

public.app-category.business

Developer Tools

public.app-category.developer-tools

Education

public.app-category.education

Entertainment

public.app-category.entertainment

Finance

public.app-category.finance

Games

public.app-category.games

Graphics & Design

public.app-category.graphics-design

Healthcare & Fitness

public.app-category.healthcare-fitness

Lifestyle

public.app-category.lifestyle

Medical

public.app-category.medical

Music

public.app-category.music

News

public.app-category.news

Photography

public.app-category.photography

Productivity

public.app-category.productivity

Reference

public.app-category.reference

Social Networking

public.app-category.social-networking

Sports

public.app-category.sports

Travel

public.app-category.travel

Utilities

public.app-category.utilities

Video

public.app-category.video

Weather

public.app-category.weather

 

UTIs for game-specific categories

Category

UTI

Action Games

public.app-category.action-games

Adventure Games

public.app-category.adventure-games

Arcade Games

public.app-category.arcade-games

Board Games

public.app-category.board-games

Card Games

public.app-category.card-games

Casino Games

public.app-category.casino-games

Dice Games

public.app-category.dice-games

Educational Games

public.app-category.educational-games

Family Games

public.app-category.family-games

Kids Games

public.app-category.kids-games

Music Games

public.app-category.music-games

Puzzle Games

public.app-category.puzzle-games

Racing Games

public.app-category.racing-games

Role Playing Games

public.app-category.role-playing-games

Simulation Games

public.app-category.simulation-games

Sports Games

public.app-category.sports-games

Strategy Games

public.app-category.strategy-games

Trivia Games

public.app-category.trivia-games

Word Games

public.app-category.word-games

 

Key:
Application does not run in background
(UIApplicationExitsOnSuspend)
Value:BOOL

说明:

         是否支持在后台运行,YES时,点击HOME键,则退出应用。NO时点击HOME键切到后台。

Key:
Application fonts resource path
(ATSApplicationFontsPath)
Value:String

说明:

        如果想使用外部字体时,可以指定外问字体的资源文件。

Key:
Application has localized display name
(LSHasLocalizedDisplayName)
Value:BOOL

说明:

        本地化显示名。设置为YES激活。

Key:
Application is agent (UIElement)
(LSUIElement)
Value:BOOL

说明:

          如果该关键字被设为“1”,启动服务会将该应用程序作为一个用户界面组件来运行。用户界面组件不会出现在Dock或强制退出窗口中。虽然它们通常作为后台应用程序运行,但是如果希望的话,它们也可以在前台显示一个用户界面。点击属于用户界面组件的窗口,应用程序将会处理产生的事件。

Dock和登录窗口是两个用户界面组件应用程序。

 

Key:
Application is background only
(LSBackgroundOnly)
Value:BOOL

说明:

         如果该关键字存在并且被设为“1”,启动服务将只会运行在后台。您可以使用该关键字来创建无用户界面的后台应用程序。如果您的应用程序使用了连接到窗口服务器的高级框架,但并不需要显示出来,您也应该使用该关键字。后台应用程序必须被编译成Mach-O可执行文件。该选项不适用于CFM应用程序。

您也可以指定该关键字的类型为Boolean或Number。然而,只有Mac OS X 10.2或以上的版本才支持这些类型的值。

 

Key:
Application is visible in Classic
(LSVisibleInClassic)
Value:BOOL

说明:

          指定代理的应用程序或后台唯一的应用程序在Classic环境中的其他应用程序是否是可见的。

Key:
Application prefers Carbon environment
(LSPrefersCarbon)
Value:BOOL

说明:

         如果该关键字被设为“1”,Finder将会在显示简介面板中显示“在Classic环境中打开”控制选项,缺省情况下该控件未被选中。如果需要,用户可以修改这个控制选项来在Classic环境中启动应用程序。

您也可以指定该关键字的类型为Boolean或Number。然而,只有Mac OS X 10.2或以上的版本才支持这些类型的值。如果您在您的属性列表中加入了该关键字,那么就不要同时加入LSPrefersClassic, LSRequiresCarbon,或LSRequiresClassic关键字。

 

Key:
Application prefers Classic environment
(LSPrefersClassic)
Value:BOOL

说明:

         如果该关键字被设为“1”,Finder将会在显示简介面板中显示“在Classic环境中打开” 控制选项,缺省情况下该控件被选中。如果需要,用户可以修改这个控制选项来在Carbon环境中启动应用程序。

您也可以指定该关键字的类型为Boolean或Number。然而,只有Mac OS X 10.2或以上的版本才支持这些类型的值。如果您在您的属性列表中加入了该关键字,那么就不要同时加入LSPrefersCarbon, LSRequiresCarbon,或LSRequiresClassic关键字。

 

Key:
Application presents content in Newsstand
(UINewsstandApp)
Value:BOOL

说明:

         是否允许应用程序在Newsstand中显示。如果设为YES。可以通过设置NewsstandIcon来美化图标。

效果:

       

Key:
Application prohibits multiple instances
(LSMultipleInstancesProhibited)
Value:BOOL

说明:

         指定一个或多个用户是否可以同时启动一个应用程序。

Key:
Application requires Carbon environment
(LSRequiresCarbon)
Value:BOOL

说明:

          如果该关键字被设为“1”,启动服务将只在Carbon环境中运行应用程序。如果您的应用程序不应该运行在Classic环境中的话,可以使用该关键字。

您也可以指定该关键字的类型为Boolean或Number。然而,只有Mac OS X 10.2或以上的版本才支持这些类型的值。如果您在您的属性列表中加入了该关键字,那么就不要同时加入LSPrefersCarbon, LSPrefersClassic,或LSRequiresClassic关键字。

 

Key:
Application requires Classic environment
(LSRequiresClassic)
Value:BOOL

说明:

         如果该关键字被设为“1”,启动服务将只在Classic环境中运行应用程序。如果您的应用程序不应该运行在Carbon兼容环境中的话,可以使用该关键字。

您也可以指定该关键字的类型为Boolean或Number。然而,只有Mac OS X 10.2或以上的版本才支持这些类型的值。如果您在您的属性列表中加入了该关键字,那么就不要同时加入LSPrefersCarbon, LSPrefersClassic,或LSRequiresCarbon关键字。

 

Key:
Application requires iPhone environment
(LSRequiresIPhoneOS)
Value:BOOL

说明:

         如果应用程序不能在ipod touch上运行,设置此项为true;

 

Key:
Application requires native environment
(LSRequiresNativeExecution)
Value:BOOL

说明:

         指定应用程序是否必须在本机运行一个基于Intel的Mac上,而不是根据Rosetta模拟。指定是否要启动该应用程序使用subbinary当前的架构。如果此键被设置为YES,启动服务始终运行应用程序使用当前的架构编译的二进制代码。您可以使用此键,以防止一个通用的二进制下运行的Rosetta模拟一个基于Intel的Mac上。

Key:
Application should get App Died events
(LSGetAppDiedEvents)
Value:BOOL

说明:

         指定是否一个子进程死亡时通知应用程序。如果你的值设置为YES这个关键,系统会发送您的应用程序kAEApplicationDied苹果事件。

Key:
Application supports iTunes file sharing
(UIFileSharingEnabled)
Value:BOOL

说明:

         应用程序支持共享   值为 boolean 值   YES 共享;  NO 不共享

Key:
Application UI Presentation Mode
(LSUIPresentationMode)
Value:NUMBER

说明:

        应用程序启动时设置系统UI元素的可见性确定了初始的应用程序的用户界面模式。你可以使用这个应用程序,可能需要采取部分包含UI元素,如在Dock和菜单栏的屏幕。大多数模式的影响只出现在内容区域中的画面,就是在屏幕的面积,不包括菜单栏的UI元素。但是,您可以要求所有的UI元素被隐藏。

Value

Description

0

Normal mode. 标准的系统UI元素可见。 默认值。

1

Content suppressed mode. In this mode, system UI elements in the content area of the screen are hidden. UI elements may show themselves automatically in response to mouse movements or other user activity. For example, the Dock may show itself when the mouse moves into the Dock’s auto-show region.

2

Content hidden mode. In this mode, system UI elements in the content area of the screen are hidden and do not automatically show themselves in response to mouse movements or user activity.

3

All hidden mode. In this mode, all UI elements are hidden, including the menu bar. Elements do not automatically show themselves in response to mouse movements or user activity.

4

All suppressed mode. In this mode, all UI elements are hidden, including the menu bar. UI elements may show themselves automatically in response to mouse movements or other user activity. This option is available only in OS X v10.3 and later.

Key:
Application uses Wi-Fi
(UIRequiresPersistentWiFi)
Value:BOOL

说明:

        如果应用程序需要wi-fi才能工作,应该将此属性设置为true。这么做会提示用户,如果没有打开wi-fi的话,打开wi-fi。为了节省电力,iphone会在30分钟后自动关闭应用程序中的任何wi-fi。设置这一个属性可以防止这种情况的发生,并且保持连接处于活动状态

Key:
Architecture priority
(LSArchitecturePriority)
Value:String

说明:

        用于标识此应用程序支持的体系结构。此阵列中的字符串的顺序决定优选的执行优先级的架构。

String

Description

i386

The 32-bit Intel architecture.

ppc

The 32-bit PowerPC architecture.

x86_64

The 64-bit Intel architecture.

ppc64

The 64-bit PowerPC architecture.

Key:
Bundle creator OS Type code
(CFBundleSignature)
Value:String

说明:

        指定了束的创建者,类似于Mac OS 9中的文件创建者代码。该关键字的值包含四字母长的代码,用来确定每一个束。

Key:
Bundle display name
(CFBundleDisplayName)
Value:String

说明:

       这用于设置应用程序的名称,它显示在iphone屏幕的图标下方。应用程序名称限制在10-12个字符,如果超出,iphone将缩写名称。

Key:
Bundle identifier
(CFBundleIdentifier)
Value:String

说明:

         身份证书,这个为应用程序在iphone developer program portal web站点上设置的唯一标识符。(就是你安装证书的时候,需要把这里对应修改)。例如com.apple.myapp。该束标识符可以在运行时定位束。预置系统使用这个字符串来唯一地标识每个应用程序。

Key:
Bundle name
(CFBundleName)
Value:String

说明:

        简称。简称应该小于16个字符并且适合在菜单和“关于”中显示。通过把它加入到适当的.lproj子文件夹下的InfoPlist.strings文件中,该关键字可以被本地化。如果您本地化了该关键字,那您也应该提供一个CFBundleDisplayName关键字的本地化版本。

Key:
Bundle OS Type code
(CFBundlePackageType)
Value:String

说明:

         关键字指定了束的类型,类似于Mac OS 9的文件类型代码。该关键字的值包含一个四个字母长的代码。应用程序的代码是‘APPL’;框架的代码是‘FMWK’;可装载束的代码是‘BND’。如果您需要,您也可以为可装载束选择其他特殊的类型代码。

Key:
Bundle version
(CFBundleVersion)
Value:String

说明:

         这个会设置应用程序版本号,每次部署应用程序的一个新版本时,将会增加这个编号,在app store用的。

Key:
Bundle versions string, short
(CFBundleShortVersionString)
Value:String

说明:

         指定了束的版本号。一般包含该束的主、次版本号。这个字符串的格式通常是“n.n.n”(n表示某个数字)。第一个数字是束的主要版本号,另两个是次要版本号。该关键字的值会被显示在Cocoa应用程序的关于对话框中。

该关键字不同于CFBundleVersion,它指定了一个特殊的创建号。而CFBundleShortVersionString的值描述了一种更加正式的并且不随每一次创建而改变的版本号。

 

Key:
Clients allowed to add and remove tool
(SMAuthorizedClients)
Value:Array

说明:

          允行添加或移除工具。具体还真不知道什么效果。没试出来。

Key:
Cocoa Java application
(NSJavaNeeded)
Value:BOOL

说明:

         用来确定在执行该束的代码之前Java虚拟机是否需要被载入并运行。

Key:
Copyright (human-readable)
(NSHumanReadableCopyright)
Value:String

说明:

         包含了一个含有束的版权信息的字符串。您可以在“关于”对话框中显示它。该关键字通常会出现在InfoPlist.strings文件中,因为往往需要本地化该关键字的值。

Key:
Core Data persistent store type
(NSPersistentStoreTypeKey)
Value:String

说明:

         核心数据存储的文档类型。

         Sqlite                                         使用SQLITE存储数据

         XML                                            使用XML文档存储数据

         Binary                                         使用二进制流文件存储数据

         Memoery                                    使用内存存储数据。

Key:
Dock Tile plugin path
(NSDockTilePlugIn)
Value:String

说明:

         停靠插件路径。

         这个Dock可以挂载一个叫NSDockTilePlugIn的 bundle,开发这个类似很多OSGI模型开发bundle一样,继承NSDockTilePlugIn,然后你实现相应的methods,完之后build出来放到指定的目录下,然后在某个特定的“动作”。

    1,build后的bundle必须放到你app下的Contents/PlugIns下,且必须在property list文件中申明,其中内容为.docktileplugin结尾的插件名。

    2,插件必须扩展NSDockTilePlugI,当插件加载的时候, setDockTile方法就会被执行,并且返回一个NSDockTile,你可以在这里做些其他初始化工作。

    3,你的插件和主程序可以同时updateDock title,但主程序的优先级更高。

    4,当你的application 从dock去除的时候,会把NSDockTile指向nil,在Object-C中指向nil的对象是自动释放内存并把指针指向NULL。

 

 

Dock Plugin 主要做几个工作:

    1,其中更改dock上application的图标。

    2,更改badge:

   3,定义自己的menu:

加徽章(Badge)                                                          -------------图标上的数字。

换图标

隐藏和显示最小化时的图标徽章

增加自定义Dock菜单

 

         苹果官方说明:      

The NSDockTilePlugIn protocol defines the methods implemented by plug-ins that allow an application’s Dock tile to be customized while the application is not running.

Customizing an application’s Dock tile when the application itself is not running requires that you write a plug-in. The plug-in’s principal class must implement the NSDockTilePlugIn protocol.

The name of the plugin is indicated by a NSDockTilePlugIn key in the application's Info.plist file.

 

Key:
Document types
(CFBundleDocumentTypes)
Value:array

说明:

         保存了一组字典,它包含了该应用程序所支持的文档类型。每一个字典都被称做类型定义字典,并且包含了用于定义文档类型的关键字。表A-2列出了类型定义字典中支持的关键字。

表 A-2 CFBundleDocumentTypes字典的关键字

关键字 类型 描述
CFBundleTypeExtensions Array 该关键字包含了一组映射到这个类型的文件扩展名。为了打开具有任何扩展名的文档,可以用单个星号“*”。该关键字是必须的。
CFBundleTypeIconFile String 该关键字指定了系统显示该类文档时使用的图标文件名,该图标文件名的扩展名是可选的。如果没有扩展名,系统会根据平台指定一个(例如,Mac OS 9中的.icons)。
CFBundleTypeName String 该关键字包含了这种文档类型的抽象名称。通过在适当的InforPlist.strings文件中包含该关键字,可以实现对它的本地化。
CFBundleTypeOSTypes Array 该关键字包含了一组映射到这个类型的四字母长的类型代码。为了打开所有类型的文档,可以把它设为“****”。该关键字是必须的。
CFBundleTypeRole String 该关键字定义了那些与文档类型有关的应用程序的角色。它的值可以是Editer,Viewer,Printer,Shell或None。有关这些值的详细描述可以参见“ 文档的配置” 。该关键字是必须的。
NSDocumentClass String 该关键字描述了被用来实例化文档的NSDocument子类。仅供Cocoa应用程序使用。
NSExportableAs Array 该关键字描述了一组可以输出的文档类型。仅供Cocoa应用程序使用。

 

Key:
Environment variables
(LSEnvironment)
Value:Dictionary

说明:

         环境变量。

Key:
Executable architectures
(LSExecutableArchitectures)
Value:Array

说明:

         可执行文件框架。

          intel -  32 bit

          intel -  64 bit

          powerpc  32 bit

          powerpc   64 bit

Key:
Executable file
(CFBundleExecutable)
Value:String

说明:

        应用程序的可执行文件。对于一个可加载束,它是一个可以被束动态加载的二进制文件。对于一个框架,它是一个共享库。Project Builder会自动把该关键字加入到合适项目的Info.plist文件中。

Key:
Exported Type UTIs
(UTExportedTypeDeclarations)
Value:array

说明:

         导出UTI(Unique Type Identifier)类型。

Key:
File quarantine enabled
(LSFileQuarantineEnabled)
Value:

Key:
Fonts provided by application
(UIAppFonts)
Value:

Key:
Get Info string
(CFBundleGetInfoString)
Value:String

说明:

         CFBundleGetInfoString关键字含有会在束的信息窗口中显示的纯文本字符串(这里的字符串也就是Mac OS 9中的长字符串)。该关键字的格式应该遵照Mac OS 9中的长字符串,例如:“2.2.1, ? Great Software, Inc, 1999”。通过把它加入到合适的.lproj目录中的InfoPlist.strings文件中,您也可以本地化该字符串。

如果存在CFBundleGetInfoHTML的话,系统不会选择使用该关键字。

 

Key:
Help Book directory name
(CFBundleHelpBookFolder)
Value:String

说明:

         帮助目录,CFBundleHelpBookFolder关键字含有该束的帮助文件的文件夹名字。帮助通常被本地化成一种指定的语言,所以该关键字指向的文件夹应该是所选择语言的.lproj目录中的文件夹。

 

Key:
Help Book identifier
(CFBundleHelpBookName)
Value:String

说明:

         CFBundleHelpBookName指定了您的应用程序的帮助主页。该关键字指定的帮助页面名可以和HTML文件名不同。在帮助文件META标签的CONTENT属性中指定了帮助页面名。

 

Key:
Help file
(CFAppleHelpAnchor)
Value:String

说明:

         定义了束的初始HTML帮助文件名,不需要包括.html或.htm扩展名。这个文件位于束的本地化资源目录中,或者如果没有本地化资源目录的话,则直接被放在Resources目录中。

 

Key:
Icon already includes gloss effects
(UIPrerenderedIcon)
Value:BOOL

说明:

         默认情况下,应用程序被设置了玻璃效果,把这个设置为true可以阻止这么做。

Key:
Icon file
(CFBundleIconFile)
Value:String

说明:

         设置应用程序图标的。CFBundleIconFile关键字指定了包含该束图标的文件。您给出的文件名不需要包含“.icns”扩展名。Finder会在该束的“Resource”文件夹内寻找图标文件。如果您的束使用了自定义的图标,那您就必须指定该属性。假如您没有指定,Finder(和其他应用程序)会使用缺省的图标来显示您的束。

 

Key:
Icon files
(CFBundleIconFiles)
Value:String

说明:

        应用程序图标。

 

Key:
Icon files (iOS 5)
(CFBundleIcons)
Value:string

说明:

        应用程序图标。

 

Key:
Imported Type UTIs
(UTImportedTypeDeclarations)
Value:

 

Key:
Initial interface orientation
(UIInterfaceOrientation)
Value:String

说明:

         确定了应用程序以风景模式还是任务模式启动。

         Portrait(bottom home button)        坚屏,状态条远离HOME按钮。

         Portrait(top home button)              坚屏,状态条近HOME键,在手机上就显示为颠倒的显示。

         Landscape(left home button)        横屏:以HOME键在左为基准,显示VIEW。即手拿真机横着时HOME按钮在左手边时,观看屏幕。

         Landscape(right home button)     横屏:以HOME键在右为基准,显示VIEW。

Key:
Installation directory base file URL
(APInstallerURL)
Value:String

说明:

          指定了一个指向您希望安装的文件的路径。您必须以file://localhost/path/ 形式来说明这个路径。所有被安装的文件必须位于这个文件夹中。

Key:
Installation files
(APFiles)
Value:Dictionary

说明:

        指定了一个字典,描述了您希望安装的文件。每个字典条目可以包含某个文件或目录的描述。您可以让APFiles 关键字包含在其自身中,用于指定在目录内部的文件。表A-8列出了用来指定有关单个文件或目录的信息。

关键字
类型
描述
APFileDescriptionKey String 用来显示在Finder的信息窗口中的简短描述。
APDisplayedAsContainer String 如果值为“Yes”,该项目作为一个目录图标显示在信息面板中;否则,它被显示为一个文档图标。
APFileDestinationPath String 一个安装组件的相对路径。
APFileName String 文件或目录的名称。
APFileSourcePath String 指向应用程序包中组件的路径,相对与APInstallerURL路径。
APInstallAction String 操纵组件的动作:“Copy”或者“Open”

 

Key:
InfoDictionary version
(CFBundleInfoDictionaryVrsion)
Value:String

说明:

        指定了属性列表结构的当前版本号。该关键字的存在使得可以支持Info.plist格式将来的版本。在您建立一个束时,Project Builder会自动产生该关键字。

Key:
Java classpaths
(NSJavaPath)
Value:String

说明:

        包含了一组路径。每一个路径指向一个Java类。该路径相对于由NSJavaRoot关键字定义的位置来说,可能是一个绝对路径也可能是一个相对路径。开发环境会自动把这些值保存在数组中。

 

Key:
Java root directory
(NSJavaRoot)
Value:String

说明:

         一个指向一个目录的字符串。该目录是应用程序的Java类文件的根目录。

Key:
Launch image
(UILaunchImageFile)
Value:string

说明:

          启动图像。根据不同设备来设置图片的规格大小。

Key:
Launch image (iPad)
(UILaunchImageFile~ipad)
Value:string

说明:

          启动图像。根据不同设备来设置图片的规格大小。

 

Key:
Launch image (iPhone)
(UILaunchImageFile~iphone)
Value:string

说明:

          启动图像。根据不同设备来设置图片的规格大小。

 

Key:
Localization native development region
(CFBundleDevelopmentRegion)
Value:

Key:
Localizations
(CFBundleLocalizations)
Value:String

说明:

         多语言。应用程序本地化的一列表,期间用逗号隔开,例如应用程序支持英语 日语,将会适用 English,Japanese.

Key:
Localized resources can be mixed
(CFBundleAllowMixedLocalizations)
Value:

Key:
Main nib file base name
(NSMainNibFile)
Value:String

说明:

         包含了一个含有应用程序的主nib文件名(不包含.nib文件扩展名)的字符串。一个nib文件作为一个Interface Builder的存档文件,含有对用户界面的详细描述信息以及那些界面中的对象之间的关联信息。当应用程序被启动时,主nib文件会被自动装载。Mac OS X会寻找与应用程序名相匹配的nib文件。

 

Key:
Main nib file base name (iPad)
(NSMainNibFile~ipad)
Value:String

说明:(IPAD)

         包含了一个含有应用程序的主nib文件名(不包含.nib文件扩展名)的字符串。一个nib文件作为一个Interface Builder的存档文件,含有对用户界面的详细描述信息以及那些界面中的对象之间的关联信息。当应用程序被启动时,主nib文件会被自动装载。Mac OS X会寻找与应用程序名相匹配的nib文件。

 

Key:
Main nib file base name (iPhone)
(NSMainNibFile~iphone)
Value:String

说明:(Iphone)

         包含了一个含有应用程序的主nib文件名(不包含.nib文件扩展名)的字符串。一个nib文件作为一个Interface Builder的存档文件,含有对用户界面的详细描述信息以及那些界面中的对象之间的关联信息。当应用程序被启动时,主nib文件会被自动装载。Mac OS X会寻找与应用程序名相匹配的nib文件。

 

Key:
Main storyboard file base name
(UIMainStoryboardFile)
Value:string

说明:

         故事板文件名。

Key:
Main storyboard file base name (iPad)
(UIMainStoryboardFile~ipad)
Value:

Key:
Main storyboard file base name (iPhone)
(UIMainStoryboardFile~iphone)
Value:

Key:
Minimum system version
(LSMinimumSystemVersion)
Value:string

说明:

        最小系统版本。

Key:
Minimum system versions, per-architecture
(LSMinimumSystemVersionByArchitecture)
Value:

Key:
Plug-in dynamic registration function name
(CFPlugInDynamicRegisterFunction)
Value:

Key:
Plug-in factory interfaces
(CFPlugInFactories)
Value:

说明:

         插件工厂接口。

Key:
Plug-in should be registered dynamically
(CFPlugInDynamicRegistration)
Value:BOOL

说明:

         是否动态注册插件。

 

Key:
Plug-in types
(CFPlugInTypes)
Value:dictionary

说明:

         插件类型。

Key:
Plug-in unload function name
(CFPlugInUnloadFunction)
Value:string

说明:

         插件卸载函数名。

Key:
Preference Pane icon file
(NSPrefPaneIconFile)
Value:

Key:
Preference Pane icon label
(NSPrefPaneIconLabel)
Value:

Key:
Preferences sync exclusion keys
(com.apple.PreferenceSync.ExcludeSyncKeys)
Value:

Key:
Principal class
(NSPrincipalClass)
Value:String

说明:

          定义了一个束的主类的名称。对于应用程序来说,缺省情况下这个名字就是应用程序的名字。

Key:
Quick Look needs to be run in main thread
(QLNeedsToBeRunInMainThread)
Value:

Key:
Quick Look preview height
(QLPreviewHeight)
Value:

Key:
Quick Look preview width
(QLPreviewWidth)
Value:

Key:
Quick Look supports concurrent requests
(QLSupportsConcurrentRequests)
Value:

Key:
Quick Look thumbnail minimum size
(QLThumbnailMinimumSize)
Value:

Key:
Renders with edge antialisasing
(UIViewEdgeAntialiasing)
Value:BOOL

说明:

          用于指示在描画不和像素边界对齐的层时,Core Animation层是否进行抗锯齿处理。这个特性使开发者可以在仿真器上进行更为复杂的渲染,但是对性能会有显著的影响。如果属性列表上没有这个键,则其缺省值为NO。这个键只在iPhone OS 3.0和更高版本上支持。

如果信息属性文件中的属性值是显示在用户界面上的字符串,则应该进行本地化,特别是当Info.plist中的字符串值是与本地化语言子目录下InfoPlist.strings文件中的字符串相关联的键时。更多信息请参见“国际

化您的应用程序”部分。

 

Key:
Renders with group opacity
(UIViewGroupOpacity)
Value:BOOL

说明:

         用于指示Core Animation子层是否继承其超层的不透明特性。这个特性使开发者可以在仿真器上进行更为复杂的渲染,但是对性能会有显著的影响。如果属性列表上没有这个键,则其缺省值为NO。这个键只在iPhone OS 3.0和更高版本上支持。

Key:
Required background modes
(UIBackgroundModes)
Value:Array

说明:

        后台执行模式。可以参见http://blog.csdn.net/fengsh998/article/details/8312764中的例子。

Key:
Required device capabilities
(UIRequiredDeviceCapabilities)
Value:Array

说明:

         指定程序适用于哪些设备。

如:

当提交程序到app store时,3.0及更高版本的应用程序不再直接说明使用哪种设备,而是使用info.plist文件来确定需要哪些设备功能。iTunes通过这个所需功能的列表来确定一个应用程序能否下载到一个指定的设备并在该设备上正常运行。

例如,我在info.plist中设置如下,那么只有居右wifi、电话功能和麦克风(内置的或附件所带的麦克风功能)的ios设备才能运行该程序。


除了wifi和telephony项,还有很多项代表各种设备功能,如下:

sms 应用程序需要Messages应用程序或者使用sms://URL
still-camera 应用程序需要使用照相机模式作为图像选取器的控制器
auto-focus-camera 应用程序需要使用更多的聚焦功能以进行微距摄影或者拍摄特别清晰的图像以进行图像内数据检测
video-camera 应用程序需要使用视频模式作为图像选取器的控制器
accelerometer 应用程序需要特定于加速计的反馈而不知是简单的UIViewController方向事件
location-services 应用程序需要使用Core Location
gps 应用程序需要使用Core Location并需要更加精确的gps定位
magnetometer 应用程序需要使用Core Location并需要与前进方向相关的事件,即行进的方向(通过磁力计获得)
peer-peer 应用程序需要使用GameKit通过蓝牙(3.1或更高版本)进行对等连接
opengles-1 应用程序需要OpenGL ES 1.1
opengles-2 应用程序需要OpenGL ES 2.0
armv-6 应用程序仅针对armv6指令集(3.1或更高版本)编译
armv-7 应用程序仅针对armv7指令集(3.1或更高版本)编译

wifi 当您的应用程序需要设备的网络特性时,包含这个键。
microphone 如果您的应用程序需要使用内置的麦克风或支持提供麦克风的外设,则包含这个键。

telephony 如果您的应用程序需要Phone程序,则包含这个键。如果您的应用程序需要打开tel模式的URL,则可能需要这个特性。

 

Key:
Resources should be file-mapped
(CSResourcesFileMapped)
Value:BOOL

说明:

          是否进行文件映射。指定是否将应用程序的资源映射文件到内存中。否则,他们通常读入内存。对于经常访问的资源数量,使用文件映射可以提高性能。然而,资源被映射到只读存储器,不能被修改。

Key:
Scriptable
(NSAppleScriptEnabled)
Value:BOOL

说明:

          说明了该应用程序是否支持AppleScript。如果您的应用程序支持,就需要把该字符串的值设为“Yes”。

Key:
Scripting definition file name
(OSAScriptingDefinition)
Value:String

说明:

          脚本文件名。

Key:
Services
(NSServices)
Value:Array

说明:

         包含了一组字典,它详细说明了应用程序所提供的服务。

NSServices字典的关键字

关键字
类型
描述
NSPortName String 该关键字指定了由您的应用程序监听器为接受外部服务请求所提供的端口名称。
NSMessage String 该关键字指定了用来调用该服务的实例方法名。在Objective-C中,实例方法的形式是messageName:userData:error:。在Java中,实例方法的形式是messageName(NSPasteBoard.String)。
NSSendTypes Array 该关键字指定了一组可以被该服务读取的数据类型名。NSPasteboard类列出了几个常用的数据类型。您必须包含此关键字,NSReturnTypes,或者两者。
NSReturnTypes Array 该关键字指定了一组可以被该服务返回的数据类型名。NSPasteboard类列出了几个常用的数据类型。您必须包含此关键字,NSSendTypes,或者两者。
NSMenuItem Dictionary 该关键字包含一个字典,它指定了加入Services菜单中的文本。字典中的唯一一个关键字被称为default并且它的值是菜单项的文本。该值必须是唯一的。您可以使用斜杠“/”来指定一个子菜单。例如,Mail/Send出现在Services菜单中时就是一个带有Send子菜单并且名为Mail的菜单。
NSKeyEquivalent Dictionary 该关键字是可选的,并且包含一个含有用来请求服务菜单命令的快捷按键的字典。与NSMenuItem类似,字典中的唯一一个关键字被称为default并且它的值是单个的字符。用户可以通过按下Command,Shift功能键和相应的字符来请求该快捷按键。
NSUserData String 该关键字是一个可选字符串,它含有您的选择值。
NSTimeout String 该关键字是一个可选的数字字符串,它指定了从应用程序请求服务到收到它的响应所需要等待的毫秒数。

 

Key:
Status bar style
(UIStatusBarStyle)
Value:String

说明:

         选择三种不同格式种的一种。

         gray

         translation aplah 5.0

         black

Key:
Status bar is initially hidden
(UIStatusBarHidden)
Value:BOOL

说明:

        设置是否隐藏状态栏。YES时隐藏,FALSE时不隐藏。

Key:
Supported external accessory protocols
(UISupportedExternalAccessoryProtocols)
Value:Array

说明:

        指定应用程序与外界硬件配件间支持的通迅协议,這個键值是一组设定,可以指定多个通迅协议。

Key:
Supported interface orientations
(UISupportedInterfaceOrientations)
Value:Array

说明:

         设定应用程序的显示模式。

Key:
Supported interface orientations (iPad)
(UISupportedInterfaceOrientations~ipad)
Value:Array

说明:

         设定应用程序的显示模式。

Key:
Supported interface orientations (iPhone)
(UISupportedInterfaceOrientations~iphone)
Value:Array

说明:

         设定应用程序的显示模式。

 

如:

iOS设备现在有三种不同的分辨率:iPhone 320x480, iPhone 4 640x960, iPad 768x1024。以前程序的启动画面(图片)只要准备一个Default.png就可以了,但是现在变得复杂多了。

如果一个程序,既支持iPhone又支持iPad,那么它需要包含下面几个图片:

Default-Portrait.png iPad专用竖向启动画面 768x1024或者768x1004

Default-Landscape.png iPad专用横向启动画面 1024x768或者1024x748

Default-PortraitUpsideDown.png iPad专用竖向启动画面(Home按钮在屏幕上面),可省略 768x1024或者768x1004

Default-LandscapeLeft.png iPad专用横向启动画面,可省略 1024x768或者1024x748

Default-LandscapeRight.png iPad专用横向启动画面,可省略 1024x768或者1024x748

Default.png iPhone默认启动图片,如果没有提供上面几个iPad专用启动图片,则在iPad上运行时也使用Default.png(不推荐) 320x480或者320x460

[email protected] iPhone4启动图片640x960或者640x920

为了在iPad上使用上述的启动画面,你还需要在info.plist中加入key: UISupportedInterfaceOrientations。同时,加入值UIInterfaceOrientationPortrait, UIInterfacOrientationPortraitUpsideDown, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight。

 

  iOS设备现在有三种不同的分辨率:iPhone 320x480、iPhone 4 640x960、iPad 768x1024。以前程序的启动画面(图片)只要准备一个 Default.png 就可以了,但是现在变得复杂多了。下面就是 CocoaChina 会员做得总结  如果一个程序,既支持iPhone又支持iPad,那么它需要包含下面几个图片:Default-Portrait.png iPad专用竖向启动画面 768x1024或者768x1004Default-Landscape.png iPad专用横向启动画面 1024x768或者1024x748Default-PortraitUpsideDown.png iPad专用竖向启动画面(Home按钮在屏幕上面),可省略 768x1024或者768x1004Default-LandscapeLeft.png iPad专用横向启动画面,可省略 1024x768或者1024x748Default-LandscapeRight.png iPad专用横向启动画面,可省略 1024x768或者1024x748Default.png iPhone默认启动图片,如果没有提供上面几个iPad专用启动图片,则在iPad上运行时也使用Default.png(不推荐) 320x480或者[email protected] iPhone4启动图片640x960或者640x920
  为了在iPad上使用上述的启动画面,你还需要在info.plist中加入key: UISupportedInterfaceOrientations。同时,加入值UIInterfaceOrientationPortrait, UIInterfacOrientationPortraitUpsideDown, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight

 

Key:
Tools owned after installation
(SMPrivilegedExecutables)
Value:Dictionary

说明:

         辅助工具,辅助工具必须有一个嵌入式的Info.plist中包含的SMAuthorizedClients的字符串数组。每个字符串是一个文本表示的代码签名要求描述一个客户端,它允许添加和删除工具。

Key:
Upgrade other bundle identifier
(UIUpgradeOtherBundleIdentifier)
Value:String

Key:
URL types
(CFBundleURLTypes)
Value:Array

说明:

          包含了一组描述了应用程序所支持的URL协议的字典。它的用途类似于CFBundleDocumentTypes的作用,但它描述了URL协议而不是文档类型。每一个字典条目对应一个单独的URL协议。

字典的关键字

关键字
类型
描述
CFBundleTypeRole String 该关键字定义了那些与URL类型有关的应用程序的角色(即该应用程序与某种文档类型的关系)。它的值可以是Editer,Viewer,Printer,Shell或None。有关这些值的详细描述可以参见“ 文档的配置”。该关键字是必须的。
CFBundleURLIconFile String 该关键字包含了被用于这种URL类型的图标文件名(不包括扩展名)字符串。
CFBundleURLName String 该关键字包含了这种URL类型的抽象名称字符串。为了确保唯一性,建议您使用Java包方式的命名法则。这个名字作为一个关键字也会在InfoPlist.strings文件中出现,用来提供该类型名的可读性版本。
CFBundleURLSchemes Array 该关键字包含了一组可被这种类型处理的URL协议。例如:http,ftp等。
1

xcode linkmap详解

iOS APP编译后,除了一些资源文件,剩下的就是一个可执行文件,有时候项目大了,引入的库多了,可执行文件很大,想知道这个可执行文件的构成是怎样,里面的内容都是些什么,哪些库占用空间较高,可以用以下方法勘察:

1.XCode开启编译选项Write Link Map File
XCode -> Project -> Build Settings -> 搜map -> 把Write Link Map File选项设为yes,并指定好linkMap的存储位置
xcode各项配置详解_第4张图片

2.编译后,到编译目录里找到该txt文件,文件名和路径就是上述的Path to Link Map File
位于~/Library/Developer/Xcode/DerivedData/XXX-eumsvrzbvgfofvbfsoqokmjprvuh/Build/Intermediates/XXX.build/Debug-iphoneos/XXX.build/

这个LinkMap里展示了整个可执行文件的全貌,列出了编译后的每一个.o目标文件的信息(包括静态链接库.a里的),以及每一个目标文件的代码段,数据段存储详情。

1

以伊书项目为例,在LinkMap里首先列出来的是目标文件列表:

# Object files:
[ 0] linker synthesized
[ 1] /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.0.sdk/usr/lib/crt1.o
[ 2] /Users/bang/Library/Developer/Xcode/DerivedData/yishu-eyzgphknrrzpevagadjtwpzzeqag/Build/Intermediates/yishu.build/Debug-iphonesimulator/yishu.build/Objects-normal/i386/TKPFileInfo.o
...
[280] /Users/bang/Downloads/yishu/yishu/Classes/lib/UMeng/MobClick/libMobClickLibrary.a(UMANJob.o)
[281] /Users/bang/Downloads/yishu/yishu/Classes/lib/UMeng/MobClick/libMobClickLibrary.a(UMANWorker.o)
[282] /Users/bang/Downloads/yishu/yishu/Classes/lib/UMeng/MobClick/libMobClickLibrary.a(MobClick.o)
[283] /Users/bang/Downloads/yishu/yishu/Classes/lib/UMeng/MobClick/libMobClickLibrary.a(UMANLaunch.o)
...

前面中括号里的是这个文件的编号,后面会用到,像项目里引用到静态链接库libMobClickLibrary.a里的目标文件都会在这里列出来。

2

接着是一个段表,描述各个段在最后编译成的可执行文件中的偏移位置及大小,包括了代码段(__TEXT,保存程序代码段编译后的机器码)和数据段(__DATA,保存变量值)

# Sections:
# Address   Size     Segment   Section
0x00002740 0x00273890 __TEXT __text
0x00275FD0 0x00000ADA __TEXT __symbol_stub
0x00276AAC 0x00001222 __TEXT __stub_helper
0x00277CCE 0x00019D9E __TEXT __objc_methname
0x00291A70 0x00012847 __TEXT __cstring
0x002A42B7 0x00001FC1 __TEXT __objc_classname
0x002A6278 0x000046A7 __TEXT __objc_methtype
0x002AA920 0x000061CE __TEXT __ustring
0x002B0AF0 0x00000764 __TEXT __const
0x002B1254 0x000028B8 __TEXT __gcc_except_tab
0x002B3B0C 0x00004EBC __TEXT __unwind_info
0x002B89C8 0x0003662C __TEXT __eh_frame
0x002EF000 0x00000014 __DATA __program_vars
0x002EF014 0x00000284 __DATA __nl_symbol_ptr
0x002EF298 0x0000073C __DATA __la_symbol_ptr
0x002EF9E0 0x000030A4 __DATA __const
0x002F2A84 0x00000590 __DATA __objc_classlist
0x002F3014 0x0000000C __DATA __objc_nlclslist
0x002F3020 0x0000006C __DATA __objc_catlist
0x002F308C 0x000000D8 __DATA __objc_protolist
0x002F3164 0x00000008 __DATA __objc_imageinfo
0x002F3170 0x0002BC80 __DATA __objc_const
0x0031EDF0 0x00003A30 __DATA __objc_selrefs
0x00322820 0x00000014 __DATA __objc_protorefs
0x00322834 0x000006B8 __DATA __objc_classrefs
0x00322EEC 0x00000394 __DATA __objc_superrefs
0x00323280 0x000037C8 __DATA __objc_data
0x00326A48 0x000096D0 __DATA __cfstring
0x00330118 0x00001424 __DATA __objc_ivar
0x00331540 0x00006080 __DATA __data
0x003375C0 0x0000001C __DATA __common
0x003375E0 0x000018E8 __DATA __bss

首列是数据在文件的偏移位置,第二列是这一段占用大小,第三列是段类型,代码段和数据段,第四列是段名称。

每一�

你可能感兴趣的:(ios,xcode)