1.如何使用 Xcode 的新下载d新 FileMerge 工具比较文件
2.[Dev] Xcode的记录
3.xcode调试心得
4.苹果代码是什么意思?
5.苹果下载的文件可以通过苹果开发者工具转化为app吗?
6.了解 Apple 的 CI 构建服务 Xcode Cloud
如何使用 Xcode 的 FileMerge 工具比较文件
经常被忽视的 Xcode FileMerge 应用程序可让您发现两个文件之间的更改。以下是闻a闻使用该工具发现差异的方法。
大多数 Apple 软件开发人员都熟悉 Apple 的源码源码集成开发环境 (IDE)?
Xcode
但是,Xcode?新下载d新
中
捆绑了几个实用程序应用程序,这些应用程序经常被忽视。闻a闻
这些是源码源码简单代源码html:
辅助功能检查器创建 ML文件合并仪器现实作曲家专业版其中一些应用程序(如 Reality Composer Pro 和 Create ML)是新的,但一个实用程序?新下载d新
FileMerge
已经存在了几十年,并且是闻a闻 OpenStep 的一部分——OpenStep?是史蒂夫·乔布斯的另一家公司 NeXT 在 年代初创建的原始开发人员工具。苹果在年收购了NeXT,源码源码其软件和操作系统(NeXTStep)变成了今天的新下载d新macOS、iOS和Xcode。闻a闻
Xcode 的源码源码“应用程序”文件夹中的应用程序。事实上,新下载d新Xcode 的闻a闻 FileMerge 是当今为数不多的从原始 NeXTStep 中幸存下来的应用程序之一,它几乎没有变化。源码源码
FileMerge最初是作为开发人员比较和合并源文件的工具而创建的,但它也可以在大多数纯文本(.txt)文件上运行良好。
NeXTStep 中的原始 FileMerge 应用程序。访问 FileMergeFileMerge 位于 Xcode 应用程序包中名为“Contents”的文件夹中名为“Applications”的子文件夹中。因此,Xcode bundle 中 FileMerge 的路径为:
Xcode.app/Contents/Applications/FileMerge.app
有两种方法可以访问 FileMerge:您可以通过从 Xcode 中的 Xcode-Open Developer Tool-FileMerge 菜单中进行选择,也可以在 Finder 中打开 Xcode App 捆绑包本身,打开 /Contents/Applications 子文件夹,然后将 FileMerge 拖到 Dock 以创建快捷指令。
要打开 Xcode 的捆绑包,请在 Finder 中按住 Command 键并单击?Xcode 图标,同时按住 Mac 键盘上的?Command?键,然后从生成的弹出菜单中选择“显示包内容”:
在 Finder 中打开 Xcode App 捆绑包。术语“包”和“捆绑包”在 macOS 中是同义词。捆绑包只是设置了特殊位的文件夹,用于告诉 Finder 它们包含可执行代码。
您还可以按住 Command 键将?FileMerge 应用程序从 Xcode 的“应用程序”文件夹拖到 Finder 的桌面上,方法是按住 Mac 键盘上的这些键,单击 Xcode 应用程序文件夹中的应用程序图标,然后拖到桌面。这将在桌面上创建指向 FileMerge 的别名快捷方式。
从 Xcode 的“打开开发工具”菜单中打开 FileMerge。如果 Xcode 图标本身位于 Finder 的 Dock 中,您可以按住 Command 键并点按它,然后从弹出式菜单中选择“打开开发工具”-“文件合并”菜单项以打开“文件合并”。这与直接从 Xcode 中打开它的效果相同。
这些方法中的任何一种都可以打开 FileMerge 只是不要从 Xcode 捆绑包中删除应用程序本身,否则可能会损坏 Xcode 应用程序的完整性。
从 Dock 打开 FileMerge。使用 FileMerge一旦 FileMerge 打开,它的界面就变得轻而易举了:你会看到一个带有两个级别的小窗口,一个用于要比较的原始文件(“左”),另一个用于较新的文件(“右”),它们应该是相同的,但包含一些与原始文件相比的变化。这两个文件都应该是纯文本文件来比较差异,但您可能会发现 FileMerge 也适用于其他一些有限类型的文本文件。
FileMerge 无法处理大多数编码的文本文件,因此最好在纯文本上使用它。如果您尝试将编码文件与 FileMerge 进行比较,您可能会收到一条警告,警告您“文件不是 ASCII”,并询问您是否要继续。
如果您选择继续,它将比较文件,但您只会看到通常毫无意义的编码比较:FileMerge 不知道如何解码大多数文件。
ASCII
是美国信息交换标准代码
的首字母缩写词,是一种古老的基于罗马的语言文本的 8 位编码。此后,ASCII 已被?
Unicode
取代,这是一种 位文本编码,因为它支持其他语言(例如亚洲和阿拉伯语)中的多字节字符,这些语言具有更大的字符集和特殊字符。尽管 Unicode 现在是当今计算机上文本编码的全球标准,但在日常使用中,您仍然可能会遇到一些较旧的 8 位 ACSII 文件。
下面是 FileMerge UI:
FileMerge 的主窗口。您可以使用 macOS 的标准“打开”工作表单击“左”和“右”按钮,也可以将这两个文件从 Finder 拖到 FileMerge 窗口右侧的地图api源码左右图像池中。做任何一个都有相同的效果。
在 FileMerge 中设置这两个文件后,您将看到它们在磁盘上的文件路径显示在“左”和“右”按钮旁边的两个编辑字段中。
现在,您可以比较文件了。我们将用一个微不足道的例子来演示。
比较文件在 FileMerge 界面中设置文件后,单击主窗口右下角的“比较”按钮。这将运行 FileMerge 的比较并打开一个包含两个文件的新差异 (diff) 窗口,突出显示每个文件中的更改。
在差异窗口中,原始文件显示在左侧,更改后的(新)文件显示在右侧。更改由彩色条带表示,这些条带随更改文件中文本更改的部分而变化。
FileMerge 的差异窗口。当您滚动浏览文件的文本时,FileMerge 会显示这些非常巧妙的条带,以动画方式显示文本的哪些部分已更改。较大的部分滚动速度较慢,因此相反的文件可以赶上。
如果较新的文件插入了文本块,则会突出显示整个文本块,但其插入点会以相同的颜色显示在另一个文件中,并且从包含插入文本的一侧伸出一条细带。当您滚动差异窗口时,波段会平滑移动,因此您可以看到更改的内容。
对于单行更改或仅更改几行,差异窗口会突出显示具有相似波段但只有几行高的更改行。
差异窗口的中心是一列,其中包含箭头,指示两个文件中的哪个文件包含更改。箭头可以向两个方向运行:向左和向右。您可以通过单击每个更改箭头所在的
中心
列中的更改条带来选择任何单个文本更改。
要选择更改,您必须单击中间列 单击差异窗口左侧或右侧窗格中的更改带不会执行任何操作。每个更改箭头上方都有一个数字,指示文件顶部的更改编号。
如果要比较的文件是任何标准编程语言的源代码文件,则差异窗口还会在左右差异窗格的顶部显示一个弹出菜单。每个菜单都包含文件中的所有函数或方法名称 从任一菜单中选择方法名称将跳转到文件中的该方法。
使用 Ancestor 和 Merge在 FileMerge 窗口的底部,您会注意到一个小注释:“放大窗口以指定祖先和/或合并路径”。
如果单击并向下拖动 FileMerge 窗口的底部,您将看到一个附加界面:
使用“祖先/合并”窗格。此 UI 允许您做的是添加额外的第三个文件以进行三向合并。要隐藏 Ancestor/Merge UI,只需单击并拖动回 FileMerge 窗口底部。
合并更改打开差异窗口后,FileMerge 通过更改带显示两者之间的差异,您可以选择处理每个更改的方式:您可以忽略每个更改,也可以将较新的文本复制到相反的文件(合并),或者您可以删除特定的更改。
您可以使用差异窗口右下角的“操作”弹出菜单来执行这些操作。
菜单上的可能选项包括:
选择左边选择正确选择两者(左边在前)两者兼而有之(首先正确)两者都不选如果选择前两个选项中的任何一个,则将对左侧或右侧的文件进行更改。选择这些选项中的任何一个将决定哪个文件将接收更改。
如果选择“同时选择”选项中的任何一个,则更改将根据左侧或右侧文件中的更改添加到两个文件中。
如果选择“两者都不选”,则该更改的箭头将从中心列中删除,指示将忽略该更改。
无论您从弹出菜单中选择哪个操作,都会进行更改 并且差异窗口中中心列中的箭头会更新以反映新的现实。
另外,请注意,UI 中没有“更改”按钮 当您从弹出菜单中选择操作时,会立即进行更改,而不会出现任何进一步的警告或用户交互。
保存对磁盘的更改使用“操作”菜单在差异窗口中进行所有更改后,您仍然必须将更改保存到磁盘以便保存它们。
与普通的跑腿类源码文本编辑器不同,当您从“文件”菜单中选择“文件-保存合并”时,FileMerge 不会自动保存对原始文件所做的更改。这样您的原始文件就可以完好无损地保留,以防您以后想按原样使用它们。
相反,当您选择“文件”-保存合并“时,系统将始终提示您使用标准的”保存“面板,以便您决定要执行的操作 如果您单击与原始左文件相同位置的”保存“按钮,则如果要替换原始文件,则将提升您。如果单击“替换”,原始文件将被覆盖。
或者,如果要将同名的原始文件保存在其他位置,可以导航到该文件,然后单击“保存”按钮,也可以将文件重命名为其他名称,并将其保存在与原始文件相同的位置 这将创建一个具有您选择的名称的新文件。
File-Save Merge As?实际上与 Save 相同,但您需要为文件指定一个新名称,以便创建一个新文件。
使用差异窗口中的“操作”菜单进行更改后,如果您尝试关闭窗口或退出 FileMerge,系统将提示您保存合并。如果您尝试在不保存的情况下关闭差异窗口,系统会提示您是否要保存。
您可以从警报中取消,也可以单击“不保存”以放弃更改。
如果单击警报中的“保存”按钮,则与从“文件”菜单中选择“文件-保存合并”相同。
无论如何,一旦保存了合并,生成的文件现在将包含您在差异窗口中所做的所有更改。如果您没有显式覆盖原始文件,则该文件将保持不变。
目录比较您还可以使用 FileMerge 比较包含文件的两个
文件夹
(目录)。为此,请使用上述技术,但在左/右界面中选择两个文件夹,而不是两个文件。
FileMerge 中的基本文件夹比较功能是检查文件集,以查看它们是否相同、任一文件夹中的文件是否已更改,或者文件是否已添加到任一文件夹或从任一文件夹中删除。
当您点击两个文件文件夹上的“比较”按钮时,FileMerge 会浏览两组文件 比较两个文件夹中包含的所有文件。
生成的文件夹比较窗口显示每个文件夹中文件集之间的差异:
目录比较结果窗口。如果两个文件夹都包含两个同名的文件,则这些文件名将在左侧显示为灰色。如果文件出现在一个文件夹中,但未出现在另一个文件夹中,则其名称将以斜体显示。
单击左窗格中的任何文件名都会在窗格的左下角显示该文件的状态。
您可以在名为“排除”的右窗格下设置要排除的文件夹更改选项。
下面是两个弹出菜单:第一个包含用于查看和比较文件的项目。从此菜单中选择一个项目将执行类似于差异窗口中的“操作”菜单的操作。
另一个名为“合并”的弹出菜单包含用于在两个比较的文件夹之间移动或合并文件的选项。您可以合并文件,选择仅使用左侧或右侧文件,完全删除文件,以及从列表中删除无法比较的任何文件。
“查看”和“合并”项目可能会令人困惑,并且它们违反了 Apple 的人机界面指南,因为当未单击它们时,它们会显示本应是菜单标签的内容:当您单击其中任何一个时,标题“查看”或“合并”会从任一菜单中消失,然后在您松开鼠标时重新出现。
请谨慎使用“合并”菜单。
使用“合并”菜单后,窗口左下角的小状态消息将更新,以反映已更改的内容。请记住,此窗口主要用于在两个比较的砍价 php源码文件夹之间合并或移动文件。
在 FileMerge 中搜索、重新比较和重置在 FileMerge 中运行文件比较后,您可以通过滚动查看上述差异窗口中的任何差异,或者您可以使用屏幕顶部 FileMerge 菜单栏中的“查找”菜单。
FileMerge 中的查找可能性包括:
转到下一步转到上一页转到线/差找到查找下一个查找上一页使用选择进行查找跳转到所选内容下一个/上一个选项允许您跳转到下一个或上一个差异、差异窗口左侧或右侧的更改或下一个冲突。冲突是两个几乎相同的文本块,它们都包含更改 因此无法进行精确比较。
您需要自行手动解决冲突。
如果在差异窗口中选择某些文本,然后选择“查找”-“使用所选内容进行查找”,则“文件合并”将打开“查找”窗口,但它会自动将所选文本插入到“查找”搜索字段中。
比较完成后,您可以通过关闭差异窗口,然后选择“文件”“比较文件”将 FileMerge 重置为其原始状态,这将重新打开 FileMerge 主窗口,但上次选择的文件路径仍然完好无损。
您还可以选择“文件”-“重新比较文件”以再次运行上一个比较。如果您对文件进行外部编辑、保存文件,然后希望在更改后重新比较它们,这将非常有用。
FileMerge 设置如果您从 Mac 屏幕顶部的 FileMerge 菜单栏中选择 FileMerge-Settings,您将看到一个 FileMerge 首选项窗口,该窗口允许您为 FileMerge 的工作方式设置各种行为:
自动换行文本显示更改编号显示合并方向在滚动条中显示更改突出差异字体目录比较选项用于比较的过滤器要忽略的文件要在“文件合并首选项”中保存更改,只需进行更改并关闭窗口即可。
“文件合并设置”窗口。几十年来,FileMerge 一直是 macOS 开发者工具的中流砥柱,但它非常有用,一旦您了解了它的工作原理,您可能会发现自己每天都在使用它。它的界面让人回想起软件小巧、简单、快速且易于使用的时代。
[Dev] Xcode的记录
构建过程可以分为预处理(preprocess) -- 编译(build) -- 汇编(assemble) -- 连接(link)这几个大的过程。
LLVM(Low Level Virtual Machine)是强大的编译器开发工具套件,其核心思想是通过生成中间代码IR,分离前后端(前端编译器,后端目标机器码)。这样做的好处是,前端新增编译器,不用再单独去适配目标机器码,只需要生成中间代码,LLVM就可以生成对应的目标机器码。下面就是LLVM的架构。
预处理:头文件引入、宏替换、注释处理、条件编译等操作;
词法分析:读入源文件字符流,组成有意义的词素(lexeme)序列,生成词法单元(token)输出;
语法分析:Token流解析成一颗抽象语法树(AST);
CodeGen:遍历语法树,生成LLVM IR代码,这是前端的输出文件;
汇编:LLVM对IR进行优化,针对不同架构生成不同目标代码,以汇编代码格式输出;
汇编器生成.o文件:将汇编代码转换为机器代码,输出目标文件(object file);
连接器:将目标文件和(.dylib、.a、.tbd、.framework)进行连接,生成可执行mach-o文件。
dwarf:debugging with attribute record formats,一种源码调试信息的记录格式,用于源码级调试;
dSym:debug Symboles,调试符号,即符号表文件。符号对应着类、函数、变量等,是内存与符号如函数名、文件名、行号等的强制引流源码映射,崩溃日志解析非常重要。可以用dwarfdump 命令来查看dwarf调试信息。
DW_AT_low_pc表示函数的起始地址 DW_AT_high_pc表示函数的结束地址 DW_AT_frame_base表示函数的栈帧基址 DW_AT_object_pointer表示对象指针地址 DW_AT_name表示函数的名字 DW_AT_decl_file表示函数所在的文件 DW_AT_decl_line表示函数所在的文件中的行数 DW_AT_prototyped为一个 Bool 值, 为 true 时代表这是一个子程序/函数(subroutine) DW_AT_type表示函数的返回值类型 DW_AT_artificial为一个Bool值,为true时代表这是一个由编译器生成而不是源程序显式声明
使用symbolicatecrash命令行
使用dwarfdump和atos工具
xcode-project-file-format这里对xcodeproj文件格式进行了说明。
xcodeproj文件包含以下元素
总体说明
结合上面的说明,对project.phxproj文件结构进行说明
项目中setting有2处,project和target中都有,那么他们之间的关系是怎样的?
在Xcode中添加代码块步骤
1、选择代码,右键选择 create code snippet,或者在顶部导航,选择Editor-create code snippet;
2、编辑信息和代码即可,其中completion表示输入的快捷方式;
3、需要修改的参数用形式添加 ;
4、所在目录~/Library/Developer/Xcode/UserData/CodeSnippets 。
还需要注意xcshareddata目录下
参考
Xcode build过程中都做了什么 Xcode编译疾如风-3.浅谈 dwarf 和 dSYM iOS崩溃日志解析&原理 - 掘金 LLVM编译流程 & Clang插件开发 8. Xcode 工程文件解析 - 掘金 XCode工程文件结构及Xcodeproj框架的使用( 二 ) XCode: Target Settings和Project Settings的区别 Xcode-项目重命名
xcode调试心得
没有系统的学习和总结过Xcode调试相关的知识,这里参考/里面的教程,总结一下调试相关的知识,算半拉翻译,半拉总结吧崩溃的表现一般来说:
SIGABRT(好处理)
EXC_BAD_ACCESS(一般内存问题)
SIGBUS
SIGSEGV
左面工具栏会按照线程分出bug所在,thread1一般主线程,其他线程的问题会在自己的位置显示。点开里面的方法都是看不懂的汇编(其实以前学过)。
对于Xcode下方有提示的bug一般很好解决,但是有时候只是简单的EXC_BAD_ACCESS,无从下手,左面工具栏中的方法也看不出所以然,这时要把顶部工具栏的breakpoint打开,也许左面就会显示出更多出问题的方法,如图打开brekpoints以后多出了所选的方法提示,找到了是数组的问题。当然也可以在左面下方滑块调节来显示出更多提示的方法。
总结的来说,就是在左面栏里找到出问题的地方
App启动的流程
上面的图的调用关系说明了App是怎么启动的,除了main方法,其他方法都是看不到的,默认封装到系统的framework里,没法看源码
方法引用错误一般来说:
[UINavigationController setList:]: unrecognized selector sent to instance 0x6d4ed
1 [UINavigationController setList:]: unrecognized selector sent to instance 0x6d4ed这种要不就是这个类没这个方法,或者调用方法的对象错误,或者拼错,比较简单
看打印信息
没有打印信息的时候,可以点这个,有时候需要多点几次,可以有更详细的错误打印信息,lldb调试输入c功能是一样的,都是让程序继续运行
This class is not key value coding-compliant
Problems[:f] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ setValue:forUndefinedKey:]: this class is notkey value coding-compliant for the key button.'
12
3
4
5 Problems[:f] *** Terminating app due to uncaught exception 'NSUnknownKeyException',
reason: '[ setValue:forUndefinedKey:]: this class is not
key value coding-compliant for the key button.'
1.有时会碰到这种错误,印象里是请求的网络列表返回为空,出现了个这么诡异的现象,这是一种情况。
2.NSUnknownKeyException指示了未知的key,而这个未知的key出现在MainViewController里,这个key的名字是button
先看nib,在这个例子里有一个button,和MainViewController的属性button连接了IBOutlet,但是@property对应的@synthesize没有写,出现了这个问题,虽然在iOS6可以不用写@synthesize了,但是在老版本可能还会出现这个问题
3.总结一下,“This class is not key value coding-compliant”这个问题出现在NIB相关的地方,一般是iboutlet已经连接,但是这个属性却不存在,常常发生在ib连着呢,属性给删了。
使用DEBUGGER
[self performSegueWithIdentifier:@"ModalSegue" sender:sender];
1 [self performSegueWithIdentifier:@"ModalSegue" sender:sender];这句话出问题了,不知道怎么处理,可以在左面选中抛出的异常expection_throw
用LLDB的debugger po $eax会调用description方法,打印全部信息
po是point object,$eax是当前cpu注册者之一,如果选中了异常错误输入这个命令,这个注册者就是NSException对象,注意$eax是用于模拟器的,真机要用$r0
可以看大原因了,是segue问题,storyboard中的问题这里就定位了
类似的,还有这些debugger方法
po [$eax class] //可以看到 (id) $2 = 0xe NSException,数字不重要NSException是问题的名字po [$eax name]//得到exception的名字po[$eax reason]//得到错误原因(unsigned int) $4 = Receiver () has no segue with identifier 'ModalSegue'
12
3
4
5 po [$eax class] //可以看到 (id) $2 = 0xe NSException,数字不重要NSException是问题的名字
po [$eax name]//得到exception的名字
po[$eax reason]//得到错误原因(unsigned int) $4 = Receiver () has no segue with identifier 'ModalSegue'
NSAssert用法
- (void)doSomethingWithAString:(NSString *)theString{ NSAssert(theString != nil, @"String cannot be nil");NSAssert([theString length] = 3, @"String is too short");. . .}
12
3
4
5
6
7
8
9
- (void)doSomethingWithAString:(NSString *)theString
{
NSAssert(theString != nil, @"String cannot be nil");
NSAssert([theString length] = 3, @"String is too short");
. . .
}
NSAssert最为一种防御型的代码,目的就是一有错,程序就伴随着异常崩溃,或者说停止运行,不往下进行。上面的代码当传入空数组的时候就会打印这个:
-- ::. Problems[:c] *** Assertion failure in -[MainViewController doSomethingWithAString:], /Users/lipengxuan/Downloads/Problems/Problems/MainViewController.m:
1 -- ::. Problems[:c] *** Assertion failure in -[MainViewController doSomethingWithAString:], /Users/lipengxuan/Downloads/Problems/Problems/MainViewController.m:有的时候程序崩溃打印信息就会出现Assertion,那么就是这句话起作用了,这个时候可以继续运行(lldb c),可以看到更详细的打印信息。
总结一下,遇到Assertion failure,就可以下一步运行看更详细的信息
BreakPoint使用breakpoint 分Exception breakPoint和breakPoint
Exception breakPoint:程序崩溃异常了会立刻暂停到断点,点加号第一个就是添加Exception断点
breakPoint:随意放
Finally!终于到了传说中的打断点,这个很基本很经典的调试方法,事实上,断点和NSLog用法差不多,只不过不用你去写了
一个简单的例子,现在有个这么个方法
- (id)initWithStyle:(UITableViewStyle)style{ NSLog(@"init with style");if (self == [super initWithStyle:style]){ list = [NSMutableArray arrayWithCapacity:];[list addObject:@"One"];[list addObject:@"Two"];[list addObject:@"Three"];[list addObject:@"Four"];[list addObject:@"Five"];}return self;}
12
3
4
5
6
7
8
9
- (id)initWithStyle:(UITableViewStyle)style
{
NSLog(@"init with style");
if (self == [super initWithStyle:style])
{
list = [NSMutableArray arrayWithCapacity:];
[list addObject:@"One"];
[list addObject:@"Two"];
[list addObject:@"Three"];
[list addObject:@"Four"];
[list addObject:@"Five"];
}
return self;
}
程序运行后我发现貌似这个方法没有执行,这是一种猜测,通常我会在方法里加入打印信息,也可以打断点,在方法定义的地方加断点,如果调用这个方法了,就会停止在这里,起到了一样的作用。
接着是单步调试
打断点,然后点击跳跃的箭头,就可以一步步的执行了,更精细的步骤可以F6,期间可以随时打印想看的变量,比如在tableview的cellForRowAtIndexPath函数中用po indexPath打印出indexPath的值
(NSIndexPath *) $3 = 0x 2 indexes [0, 1]
1 (NSIndexPath *) $3 = 0x 2 indexes [0, 1]意思就是section 0 row 1
这样进行一步打印一次,可以看出indexes也在变化,知道出问题的敌方
Problems[:f] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 5 beyond bounds [0 .. 4]'*** First throw call stack:(NSIndexPath *) $ = 0xa8a6c0 2 indexes [0, 5]
12
3
4
5
6
7 Problems[:f] *** Terminating app due to uncaught exception 'NSRangeException',
reason: '*** -[__NSArrayM objectAtIndex:]: index 5 beyond bounds [0 .. 4]'
*** First throw call stack:
(NSIndexPath *) $ = 0xa8a6c0 2 indexes [0, 5]
单步调试找出来了index row=5超出了数组的范围
总结一下,po命令非常实用,只要找到正确的调用方法,就可以打印对象信息
ZOMBIES问题EXC_BAD_ACCESS问题一般是内存问题,比如下面这种情况
程序停在了这里,EXC_BAD_ACCESS问题,但是也不知道具体问题是什么,这时候可以用zombie 工具检测
Xcode点击左上角项目名字-Edit Scheme-Diagnostics-Enable Zombie Objects,OK再次运行
会多出这段话
-- ::. Problems[:c] *** -[__NSArrayM objectAtIndex:]: message sent to deallocated instance 0xcbe
1 -- ::. Problems[:c] *** -[__NSArrayM objectAtIndex:]: message sent to deallocated instance 0xcbe这段话什么意思呢?
创建一个对象,alloc一个对象会分配给这个对象一块内存,党这个对象release了,引用计数归零了,这块内存就会dealloc掉,之后其他对象就可以用这块内存。
但是可能有这样一种情况,正在有对象使用的内存被另一个对象企图指向使用,或者已经被释放的内存企图再次被释放。
僵尸工具的作用是让对象被released的时候,内存不dealloc,这块内存被标记为“undead”,如果其他对象想再用这块内存,app可以识别出错误并显示“message sent to deallocated instance”,就像上面的那段话一样。结合上面的代码
cell.textLabel.text = [list objectAtIndex:indexPath.row];
1 cell.textLabel.text = [list objectAtIndex:indexPath.row];这段话就是zombie对象出现的地方,一般来说textLabel 还有indexPath.row应该没问题,问题应该出现在list这个数组,而且zombie tool也说了是[__NSArrayM objectAtIndex:]的问题,利用NSLog打印list,可以看到内存地址和错误的地址相同,那么错误就定义在list了
-- ::. Problems[:c] list is 0xb0ed-- ::. Problems[:c] *** -[__NSArrayM objectAtIndex:]: message sent to deallocated instance 0xb0ed0
12
3 -- ::. Problems[:c] list is 0xb0ed0
-- ::. Problems[:c] *** -[__NSArrayM objectAtIndex:]: message sent to deallocated instance 0xb0ed0
当然用dubugger 命令 p list也可以打印出这个结果
这就是zombie 工具起的作用,解决内存问题
总结的来说,如果出现了EXC_BAD_ACCESS错误,打开僵尸工具,再试一遍。但是没问题的时候不要打开这个工具,因为这个工具从不dealloc内存,只是标记内存为”undead”,会导致内存泄露,所以用的时候再打开,诊断后再关掉。
习惯问题应该看bug一样的视线看warning,能修复就修复。
- (void)buttonTapped:(id)sender{ NSLog(@"You tapped on: %s", sender);}
12
3
4
5
6
7 - (void)buttonTapped:(id)sender
{
NSLog(@"You tapped on: %s", sender);
}
比如这个按钮点击事件,%s是打印C-String,就是末尾是NUL的字符串,但是这里sender是按钮对象,所以会崩溃,不能忽略警告
苹果代码是什么意思?
苹果代码是指苹果公司的软件开发工具Xcode中编写的代码。苹果代码可以用于iOS、macOS等系统上,开发出不同种类的应用程序。苹果公司为了方便开发者编写代码,提供了丰富的开发框架和API,同时也保证了苹果代码的安全性和稳定性,尽可能地减少程序崩溃的风险。对于开发iOS、macOS应用程序的开发者们来说,熟练掌握苹果代码是非常重要的。
苹果代码也可以指苹果公司推出的一种防止逆向工程的技术。这种技术可以让软件应用更难被破解,从而保护软件著作权,确保开发者的利益。苹果公司通常在iOS系统升级后会增加新的安全技术,其中就包括了苹果代码技术。这种技术可以有效地阻止黑客修改、篡改应用程序的源代码,确保应用程序的完整性和可靠性。
苹果代码还可以是指苹果公司的品牌形象中的代表。苹果公司一直以来十分重视品牌认知度的提升和保护,因此在这方面做得非常成功。苹果代码不仅仅表示创新、科技、高端的品牌定位,也寓意反垄断、公平竞争的品牌哲学。苹果公司的成功不仅来源于其高品质和高技术的产品,也在于其对品牌形象和文化的一致性和强大的传播能力。
苹果下载的文件可以通过苹果开发者工具转化为app吗?
苹果下载的文件可以通过苹果开发者工具Xcode转化为APP。
首先,需要了解的是,苹果iOS系统上的应用程序(APP)都是通过一个名为Xcode的开发者工具创建的。Xcode是苹果公司提供的一款强大的集成开发环境(IDE),它包含了开发iOS、macOS等应用程序所需的所有工具和资源。因此,要将一个下载的文件转化为APP,实际上是需要通过Xcode进行编译和打包的过程。
具体来说,如果你有一个已经编写好的iOS应用程序的源代码文件(通常是用Swift或Objective-C编写的),你可以使用Xcode打开这个文件,然后进行编译和打包。这个过程会将源代码文件转化为一个可以在iOS设备上运行的APP。打包完成后,你可以通过iTunes或TestFlight等工具将APP安装到你的iOS设备上。
如果你下载的文件并不是一个源代码文件,而是一个已经编译好的APP文件(例如.ipa文件),那么你可以直接将这个文件安装到你的iOS设备上。这个过程可以通过iTunes、App Store、TestFlight或第三方工具(如Cydia Impactor)完成。需要注意的是,安装非App Store来源的APP有一定的风险,因为这些APP可能没有经过苹果的安全审核,可能存在恶意软件或病毒等安全风险。
此外,对于没有编程基础的用户,也有一些在线平台和工具可以帮助你将一些特定的文件(如HTML5网页、React Native项目等)转化为iOS APP。这些平台通常提供了一个简单的用户界面,让你上传你的文件,然后进行一些基本的配置和设置,最后生成一个可以在iOS设备上运行的APP。但是需要注意的是,这些平台生成的APP可能有一些功能限制或性能问题,而且可能无法通过苹果的安全审核在App Store上发布。
总的来说,将下载的文件转化为iOS APP需要一定的技术和知识,包括编程语言、开发工具、安全审核等方面的内容。如果你是开发者或有一定的技术背景,可以通过Xcode等工具进行编译和打包;如果你是普通用户或没有编程基础,可以通过一些在线平台和工具进行尝试。但无论哪种方式,都需要注意安全风险并遵守相关的法律法规。
了解 Apple 的 CI 构建服务 Xcode Cloud
Xcode Cloud 是 Apple 为开发者提供的持续集成构建服务。以下是开始将它用于您自己的软件创建的方法。
在?WWDC? 上,Apple 为其开发 IDE 推出了名为?Xcode?Cloud 的新云构建服务。
Xcode Cloud 是托管在 Apple 服务器上
的持续集成
(CI) 构建服务,允许开发团队协作并自动执行软件配置和构建的构建和软件打包服务。持续集成背后的理念是,一个机器人或一组机器人监视源代码存储库中的代码更改,然后以特定的时间间隔检索源代码,自动构建软件组件,并自动将其分发给利益相关者。
使用 CI,开发人员和公司可以通过允许其他计算机手动管理构建过程来加快构建和分发时间。有了 CI,开发人员不得不花时间进行手动构建的日子已经一去不复返了。
将 CI 视为自动化生成工程师 一个可以为你管理生成和分发各个方面的机器人。
要求要使用 Xcode Cloud,您必须满足以下要求:
注册 Apple Developer Program使用 Xcode .0.1 或更高版本在 Xcode 的设置中添加您的 Apple ID在 App Store Connect 中为您的 App 添加 App 记录将 Xcode Cloud 连接到您的在线源代码管理系统成本Apple 现在为每个 Apple 开发者帐户提供 小时的 Xcode Cloud 免费计算时间。额外的计算小时数为 、 和 个计算小时,范围从每月 . 美元到 . 美元不等。
有关详细信息,请参阅?Xcode Cloud 概述页面。
复杂性请注意,使用 Xcode Cloud 并非易事。苹果试图让Xcode Can更容易上手,但这些努力都失败了。
Xcode Cloud 很复杂,要完全理解如何使用它,您可能需要阅读多达
十
个或更多 Apple 开发者文档的不同部分——而 Apple 的开发者文档已经过于冗长和分散。
你可能会发现自己在 Apple 的 Xcode Cloud 开发人员页面上从一个链接跳到下一个链接,却发现你已经浏览了文档,以至于你忘记了你打算理解的主题。
App Store Connect 是 Apple 的 Web 门户,开发者和团队可在其中管理团队成员、App 设置、详细信息以及开发者之间的协作。对于 App Store Connect 和 Xcode Cloud,您需要拥有 Apple 开发者帐户和 Apple ID 才能登录。
存在帐户问题、团队和权限问题、源代码管理设置和配置以及 App Store Connect 问题。
特别是,如果你在 App Store Connect 的“证书、标识符和描述文件”部分中有一个较旧的 App ID,并且在 Xcode Cloud 发布后没有设置它,你可能会发现 App Store Connect 门户中的 Xcode Cloud 标签页根本无法用于该 App:
旧版 App ID 上的 Xcode Cloud 失败。Apple 目前对此没有任何解释,在这种情况下,您唯一的办法是首先从 App Store 中删除该 App,删除 App ID,然后使用相同的 App Bundle ID 创建一个新 App ID,然后在 App Store Connect 中为该?App?ID 设置 Xcode Cloud。
这是苹果的荒谬和不可原谅的疏忽。
更糟糕的是,如果您必须删除并重新创建 App ID,您还可能丢失该 App 的所有过去指标和分析数据,并且您必须重新输入并重新上传所有 App 细节、屏幕截图和影片到 App Store Connect。
您或您的团队成员还需要熟悉源代码管理,例如 git、GitHub 或其他受支持的源代码管理系统之一。
您至少需要阅读以下大部分文档:
App Store 连接App Store Connect 的证书、标识符和描述文件App Store Connect 的团队和成员管理Xcode 源代码管理Xcode 演唱和功能Xcode 方案和共享关于使用 Xcode Cloud 进行持续集成和交付为您的团队配置 Xcode Cloud使依赖项可用于 Xcode Cloud使用 Xcode Cloud 的要求源代码管理要求配置您的第一个 Xcode Cloud 工作流程此外,Apple 在 Xcode 中更改了 Xcode 的构建系统,因此如果您还不熟悉这些更改,则需要阅读 Xcode?
发行说明中的?
Xcode 构建系统发行说明
页面。
准备好花费数小时甚至
数天
的时间查看 Apple 的开发者文档。
项目和工作区要求您必须在项目或工作区中配置一长串内容才能使用 Xcode Cloud。这个列表很大,所以我们不会在这里讨论。
您可以在 Apple Xcode Cloud 要求页面中阅读有关?Xcode?项目和工作区要求的更多信息。
项目满足要求后,必须将 Xcode Cloud 配置为在 GitHub、GitLab、BitBucket 或 BitBucket 服务器上访问项目的源代码管理帐户。Xcode Cloud 需要基于 git、支持网络的 SCM 系统才能工作。
如果您的项目有 SCM(源代码管理)管理员,请让他们配置 Xcode Cloud 和开发团队的帐户,以使用上述 SCM 服务之一在 Xcode Cloud 中访问您的 SCM 帐户。
将 Xcode Cloud 连接到 GitHub。Apple 在为您的团队配置 Xcode Cloud?页面上提供了更多信息。
Apple 还在 Xcode Cloud 要求页面上提供了有关使用生成或修改 Xcode 项目或工作区的第三方工具的警告:
重要提示
:Xcode Cloud 需要始终存在的一致 Xcode 项目或工作区。如果您使用动态生成或编辑项目或工作区的第三方工具,则 Xcode Cloud 的初始配置和后续构建可能会失败。
如果您尚未将 Xcode Cloud 连接到 SCM 系统,当您打开已在 App Store Connect 中设置了 App ID 和捆绑 ID 的 Xcode 项目时,下次打开 Xcode 项目时,您可能会在 Xcode 中看到以下警告:
更深入地了解构建细节查看并理解所有 Xcode Cloud 和 App Store Connect 开发者信息,将 Xcode Cloud 连接到 GitHub 或其他受支持的云 SCM 服务,并将 App ID 配置为使用 Xcode Cloud 后,即可开始在 Xcode 本身中使用它。
作为一项 CI 服务,Xcode Cloud 允许您指定要监控的源代码存储库,包括要使用的分支、配置构建、运行和监控构建,以及检查构建是否存在错误。Xcode Cloud 机器人允许您使用 Apple 的 TestFlight 构建分发应用程序和服务配置何时运行构建、监控构建以及自动何时分发构建。
例如,您可以将 Xcode Cloud 机器人设置为每晚运行构建,以及在特定项目里程碑、发生源代码提交时或仅在存储库中的某些分支发生更改时运行构建。
Xcode Cloud 机器人可以告诉您构建何时以及是否失败、导致失败的原因以及责任人。
Xcode 中的“Xcode 云概览”窗格。设置 Xcode Cloud 机器人后,构建会在您指定的时间自动运行,您不再需要担心构建软件 Xcode Cloud 会为您处理所有构建。
当前版本的 Xcode Cloud 能够在您授权后登录您的 GitHub 存储库,并检索源代码以在 Apple 的 Xcode Cloud 服务器上自动私下构建。所有代码下载和构建都在 Apple 的服务器上进行,因此您不必担心将构建计算机配置为构建服务器。
您还可以通过单击“Xcode 可以构建摘要”选项卡中的“我的”选项卡来查看整个团队或仅为您查看所有构建状态和错误。
使用“我的”选项卡仅查看您的结果。在 Xcode 中使用 Xcode Cloud一旦所有的设置和文档麻烦都解决了,苹果
已经
使Xcode Cloud在Xcode IDE应用程序中相当容易使用。您还可以在面向开发人员的 Apple App Store Connect Web 门户中查看和配置一些 Xcode Cloud 详细信息。
要在?Mac?上的 Xcode IDE 中开始使用 Xcode Cloud,请启动 Xcode,然后从屏幕顶部菜单栏的“产品”菜单中选择“Xcode Cloud-Create Workflow”:
请注意,在 Xcode 项目的 App ID、团队和签名设置以及 SCM 信息连接到 Xcode Cloud 之前,Xcode Cloud 菜单项不会显示在?Xcode?中。
接下来,在项目或工作流窗口左侧的 Xcode 项目编辑器中,选择“本地”选项卡旁边的“云”选项卡。这会将 Xcode 中的视图切换到 Xcode Cloud 视图。
在“云”视图中,您可以看到当前项目的所有生成工作流和任务。您还可以在此视图中查看最近生成的结果。
云视图右侧还有一个“开始构建”按钮,用于立即开始运行构建。App Store Connect 中的构建布局视图与网页版面类似。
如果生成因错误而失败,则概述窗格中将显示“重新生成”按钮。
Xcode Cloud 工作流程Xcode Cloud 使用
工作流
来设置构建条件,以便在构建开始时运行。
若要在 Xcode 项目中创建新的 Xcode Cloud 工作流,请在左侧项目窗口导航器中选择“云”选项卡,然后从 Xcode 的菜单栏中选择“Product-Xcode Cloud-Create Workflow”。
这将在 Xcode 中打开 Xcode Cloud 项目载入表:
在这里,您可以授予对 GitHub 上的源代码存储库或其他受支持的基于 Git 的服务之一的访问权限。这假设您的 SCM 系统已在上述 Xcode Cloud 设置步骤中连接。
授予对 GitHub 的访问权限。授予访问权限后,您可以在工作表中为 Xcode Cloud 工作流程设置初始条件。其中包括启动条件、环境、操作和发布操作。
您还可以通过电子邮件或 Slack 设置通知。
在“常规”行下,可以为工作流指定名称和描述,从弹出菜单中选择存储库,然后选择项目或工作区。在下一步中设置初始生成条件之前,您需要设置这些条件。
在“常规”选项卡下设置工作流信息。在“启动条件”下,您可以选择用于构建的 git 分支、何时根据 SCM 更改触发构建,以及是在任何文件更改时还是基于自定义条件启动构建。
设置生成的所有启动条件后,单击“保存”按钮。
设置生成开始条件。您还可以设置在生成期间和之后要执行的环境设置和操作。
配置 Xcode Cloud 工作流程后,Xcode Cloud 将开始根据您设置的条件运行基于云的构建。
监测您可以随时通过点按 Xcode 项目导航器窗口中的“云”标签页,或在 App Store Connect 的“Xcode?云”标签页下查看构建状态。
Xcode 项目导航器中的“云”选项卡提供了所有构建的摘要、每个构建的结果以及每个项目参与者可能发生的任何错误。通过“概述摘要”窗格,可以快速浏览所有生成结果。
陡峭的学习曲线,但非常有用一旦您度过了陡峭的学习曲线,Xcode Cloud 就具有很大的潜力。但是,除非您是一个非常快速的阅读者,否则请准备好至少花几天时间查看文档并使用 Xcode Cloud 和 Xcode 的功能来掌握产品。
为了使 Xcode Cloud 无缝且易于使用,Apple 需要首先修复 App Store Connect 问题,然后在 Apple Store Connect 中简化配置。在升级签名和功能功能的方式中进行一些自动配置会很好。
最重要的是,Apple 减少、缩短、精简和整合了开发者文档,以便更快、更轻松地学习和使用 Xcode 云。
从团队和自动化的角度来看,毫无疑问,Xcode Cloud 是有益的。从构建服务器基础架构和管理中解放出来,对任何开发团队来说都是一个胜利。
即使在最高层,每月的 Xcode Cloud 成本也可能远低于同等的构建和服务器工程师团队。
一旦 Apple 解决了上述问题,Xcode Cloud 将成为任何公司或开发团队的巨大资产。
在以后的文章中,我们将深入探讨如何使用 Xcode 工作流程,以及如何在 Xcode Cloud 中运行测试。
å¨Mac ä¸ä½¿ç¨ Git ä¸å®è¦å®è£ Xcode å
1ãå½¢å®è£ ã
å¯ä»¥ä»/p/git-osx-installer/ä¸è½½ææ°çå®è£ å åï¼åå»å¼¹åºä¸ä¸ªæ件æµè§çªå£ï¼ç¶ååå»çªå£é带pkgåç¼çæ件就å¯ä»¥å®è£ äºã
2ãç¼è¯å®è£ ã
å¨å®è£ åï¼åºè¯¥ç¡®ä¿ç³»ç»ä¸å·²ç»å®è£ äºXcodeï¼Xcodeå¯ä»¥ä» Mac OS Xçç³»ç»å®è£ çéæ¾å°ï¼å¦æ没æç³»ç»çï¼å¯ä»¥ä¸è½½ã
Gitæºç å¯ä»¥ä»http://kernel.org/pub/software/scm/git/è·å¾ã
ä¸é¢æ¯ç¼è¯å®è£ çè¿ç¨ï¼
#设置ç¯å¢åé mate ââ/.profile export PATH=â/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin:$PATHâ source ââ/.profile
#çç设置åçPATH echo $PATH
#å建ä¸ä¸ªä¸´æ¶ç®å½æ¥åæ¾gitæºç mkdir ââ/src cd ââ/src
#ä¸è½½gitæºç ï¼ä¸è½½ççæ¬æ¯1.7.2 curl -O http://kernel.org/pub/software/scm/git/git-1.7.2.tar.bz2
#ä¸è½½å®åï¼è§£åãç¼è¯ãå®è£ tar xzvf git-1.7.2.tar.bz2 cd git-1.7.2
./configure --prefix=/usr/local make sudo make install
çå®è£ å®æåï¼å¯ä»¥ä½¿ç¨which git ågit --versionå½ä»¤æ£æ¥å®è£ æ¯å¦æåï¼å¦æçå°çè¾åºï¼å®è£ å°±æåäº