1.Xcode 15.3 (15E204a) - Apple 平台 IDE
2.一分钟学会用Apple敲写C语言代码
3.30分钟学会iOS 11开发环境xcode 9图文教程
4.苹果下载的码实文件可以通过苹果开发者工具转化为app吗?
5.xcode调试心得
6.[Dev] Xcode的记录
Xcode 15.3 (15E204a) - Apple 平台 IDE
Xcode .3 (Ea) - Apple 平台 IDE
访问原文链接:sysin.org/blog/apple-xc...,查看最新版。码实原创作品,码实转载请保留出处。码实
visonOS 支持已更新。码实
更新的码实生死狙击魔方源码Xcode .3提供了为iOS、iPadOS、码实macOS、码实watchOS、码实tvOS和visionOS开发、码实测试和分发应用程序的码实工具。新增功能包括增强的码实代码完成、交互式预览和实时动画,码实以及Git staging功能,码实无需离开代码即可进行提交。码实visonOS支持也得到了更新。
此版本的Xcode使用户能够更高效地进行应用程序开发,通过改进的代码完成功能和针对Apple芯片的多核架构优化的链接器,项目构建速度更快。代码组织方面,新书签导航器帮助用户跟踪代码地标,本地化资产简化在新的String Catalog中操作,并且文档设计精美,提供实时预览功能。
Swift和SwiftUI在Xcode .3中协同工作,支持Swift宏,提供更易用的预览功能,交互式时间轴帮助开发者和设计者。直接在预览画布中选择平台和设备,确保视图在任何地方都表现出色。
调试功能得到增强,在源代码编辑器中使用宏,设置断点并进入生成代码。结构化控制台提供轻松访问调试输出。Xcode云集成使构建、实时状态监控和自动分发变得简单。
下载Xcode并利用这些资源为所有Apple平台构建应用程序。Xcode .3发布日期为5 Mar ,要求系统为macOS .0或更高版本。包含的SDKs有iOS .4、iPadOS .4、tvOS .4、iappphp获取相册源码watchOS .4、macOS Sonoma .4和visionOS 1.1。从iOS 、tvOS 、watchOS 4和visionOS起支持设备上的调试功能。需要运行macOS Sonoma 或更高版本的Mac设备。
更多下载资源:macOS下载汇总(系统、应用和教程)
一分钟学会用Apple敲写C语言代码
本文主要讲解如何在一分钟内利用Apple的Xcode编写C语言代码。Xcode作为Apple官方的IDE,对于Mac程序开发至关重要,它支持C、C++、Objective-C和Swift等多种编程语言。安装Xcode非常简单,只需在AppStore下载即可。以下是快速上手步骤:
1. 打开Xcode,选择“创建新Xcode项目”,在新建工程中选择“OSX”->“应用程序”->“命令行工具”,设置产品名称和编程语言(C语言)。
2. 填写项目信息,如产品名称、组织名称和标识符,然后创建工程。
3. 在Xcode中运行C语言程序,首先创建工程,添加源代码,然后使用编辑器技巧,如关闭浏览器窗口(command+shift+E)、Cocoa文本域的快捷键,以及文件查找和配合.h文件的打开方法。
4. 学习调试技巧,包括暴力调试(通过NSLog输出信息)和使用调试器(如GDB)进行更高级的调试。Xcode的调试功能非常强大,包括微型调试器、调试窗口和控制台。
通过本文的引导,你已经对Xcode有了初步了解。深入学习Xcode需要不断实践,如果你需要C/C++学习资料,可以私信获取。记住,tome4源码学习编程是个团队行为,找到合适的伙伴一起进步会更有效。
分钟学会iOS 开发环境xcode 9图文教程
Xcode作为一款功能强大的开发工具,对于在Mac上进行iOS应用程序开发的人来说,掌握它的使用方法是必不可少的。本文将深入讲解Xcode 9的开发环境基本知识,为读者在后续的学习中打下坚实的基础。让我们一起来探索Xcode 9的面板、操作以及如何高效利用它。 **1.1 基本面板介绍** 当使用Xcode 9打开一个iOS 项目时,会看到如下界面布局: **调试区域**:位于左上角,控制程序的编译、调试和终止调试,同时提供选择Scheme目标的功能。三角形图标启动模拟器运行iOS程序,正方形图标则停止程序运行。 **资源管理器**:左侧区域,包含多种视图选项,如Class视图、搜索视图、错误视图等,帮助开发者管理项目资源。 **工程面板**:主要区域,显示工程的总体信息,如编译信息、版本信息和团队信息。鼠标选择源代码文件时,会切换至“编码面板”,显示文件的源代码内容。 **属性面板**:在Storyboard或xib设计时提供,用于设置控件属性,与Visual C++、Visual Studio.NET中的属性面板类似。 **1.1.1 调试工具栏** 调试工具栏提供了运行、停止运行、选择虚拟器属性以及关闭视图控制器等功能,具体界面如图所示,帮助开发者在调试过程中高效控制程序运行。 **1.1.2 导航面板介绍** 导航面板包含多个导航类型,包括项目导航、符号导航、认证系统网站源码搜索导航、错误导航、测试导航和调试导航等,分别用于项目管理、类方法搜索、关键字搜索、错误提示和测试管理。 **1.1.3 检查器面板** 检查器面板用于显示文件相关信息,如文件名、类型、路径和编码等,快速帮助面板则提供代码片段的帮助信息。 **1.2 Xcode 9的基本操作** **1.2.1 改变公司名称** 在项目头部修改为公司或项目名称,以便清晰标识。 **1.2.2 通过搜索框缩小文件范围** 利用搜索功能快速定位特定类或文件,提高开发效率。 **1.2.3 格式化代码** 通过全选文字、剪切、粘贴实现代码自动格式化,保持代码整洁。 **1.2.4 代码缩进和自动完成** 使用Tab键或快捷键实现代码缩进与自动完成功能,减少重复输入。 **1.2.5 文件内查找和替代** 快速查找和替代代码中的特定内容,提高代码修改效率。 **1.2.6 快速定位到代码行** 使用快捷键定位光标至文件的特定行,方便代码定位。 **1.2.7 快速打开文件** 通过“Open Quickly”命令快速打开需要的头文件,节省查找时间。 **1.2.8 自定义导航条** 根据需求自定义导航功能,提高开发效率。 **1.2.9 使用Xcode帮助** 快速查看API文档,利用帮助系统解决开发中的问题。 **1.2. 调试代码** 设置断点、运行代码,通过调试工具检查程序流程和变量值,确保程序正确运行。 掌握Xcode 9的基本知识和操作技巧,能够显著提高iOS应用程序开发的效率和质量。通过本文的介绍,希望您能够快速上手,享受开发的kodo设置源码输出乐趣。苹果下载的文件可以通过苹果开发者工具转化为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等工具进行编译和打包;如果你是普通用户或没有编程基础,可以通过一些在线平台和工具进行尝试。但无论哪种方式,都需要注意安全风险并遵守相关的法律法规。
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是按钮对象,所以会崩溃,不能忽略警告
[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-项目重命名
2024-12-22 16:44
2024-12-22 15:47
2024-12-22 15:30
2024-12-22 15:10
2024-12-22 14:29
2024-12-22 14:23