Objc: 使用Xcode

Xcode技巧
本文介绍了Xcode的多种实用功能,包括自定义代码样式、快速搜索文件、代码格式化、自动完成、快照设置、查找替换、书签使用、自定义导航条、查看API文档及调试技巧等,有助于Objective-C开发者提升编码效率。

转载:http://marshal.easymorse.com/tech/objc-%E4%BD%BF%E7%94%A8xcode

Xcode功能很多,以下介绍常用的功能,帮助ObjC开发人员提高编码和调试效率。

 

改变公司名称

通过xcode编写代码,代码的头部会有类似下面的内容:

image

应该将这个内容改为公司或者项目的名称。

在xcode 3.2.x之前,需要命令行设置变量。比如《objective-c基础教程》第七章中提到的方式。

之后,可以通过xcode的配置项操作了。操作步骤见下面图示:

image

然后:

image

这样,再创建文件,就有类似这样的效果了:

image

 

通过搜索框缩小文件范围

当项目开发到一段时间后,源代码文件会越来越多。再从Groups & Files的界面去点选,效率比较差。可以借助Xcode的浏览器窗口,即:

image

这里插一句,如果讨厌显示这个窗口,也可以通过快捷键:shift+command+e来切换是否显示。

还是继续说搜索框缩小文件范围。上图的搜索框,可以输入关键字,这样浏览器窗口里只显示带关键字的文件了。比如我只想看Book相关的类。

image

 

如何格式化代码

比如下面这段代码:

image

很多行都顶格了。需要进行格式化。可以选中需要格式化的代码,然后在上下文菜单中找:

image

这是比较规矩的办法。Xcode没有提供快捷键,当然自己可以设置。我又比较喜欢用快捷键。我的做法是:ctrl+a(全选文字),ctrl+x(剪切文字),ctrl+v(粘贴文字)。Xcode会对粘贴的文字格式化。

如何缩进代码

代码有的时候要缩进,有的时候又要做相反的操作。单行缩进和其他编辑器类似,tab键即可。如果选中多行呢?需要快捷键了。command+]表示缩进,command+[表示反向缩进。

 

代码的自动完成

使用IDE工具的一大好处是,工具能够帮助我们自动完成比如冗长的类型名称。Xcode提供了这方面的功能。

比如上面提到的输出日志:

NSLog(@"book author: %@",book.author);

如果都自己敲,很麻烦的。可以先敲ns,然后快捷键:ctrl+.,会自动出现:

image

然后填写参数就行了。ctrl+.快捷键的功能是,自动给出第一个匹配ns关键字的函数或类型。刚巧NSLog是第一个。如果继续ctrl+.,则会出现比如NSString。以此类推,会显示所有ns开头的类型或函数,循环往复。

或者,也可以用ctrl+,快捷键,比如还是ns,那么会显示全部ns开头的类型、函数、常量等的列表。可以在这里选择。

其实,Xcode也可以在你敲代码的过程中自动给出建议。比如咱们要敲NSString。当敲到NSStr的时候:

image

后面的ing就自动冒出来了。如果和你预想的一样,直接按tab键确认即可。也许你想输入的是NSStream,那么可以继续敲。另外,也可敲esc键,这时就会出现结果列表供选择了。

image

如果是正在输入方法,那么会自动完成比如下面的样子:

image

可以tab键确认方法中的内容,继续。或者可通过快捷键ctrl+/,在方法中的参数来回切换。

 

设置项目快照以及恢复到快照

其实在不用Xcode之前,我根本没有使用这种东西的需求。如果使用Eclipse,我习惯把代码提交到SVN上,并借助SVN的copy功能实现服务器端的快照。

Xcode上使用版本控制不是很方便。因此本地快照功能还是很值得使用的。

快照(snapshot),主要作用是,创建快照,好比,给你的项目拍了个照。然后你可以随便修改代码了,不必担心改乱了无法回退到之前的版本。如果确实改乱了,恢复到快照就可以了。恢复后,好像什么也没发生过。

image

可以通过make snapshot创建快照,或者快捷键ctrl+command+s。

想要恢复的时候:

image

然后选中做快照的版本:

image

make按钮可拍照当前项目,生成新的快照。可在comments中写下该快照的备注信息,便于以后恢复时辨别。delete按钮可删除不必要的快照。restore,将用选中的快照覆盖当前项目。show files可列出选中快照和当前项目文件的差异。

image

上图列出了有两个文件不同。再选中文件:

image

可以看到不同的地方给出了标注。

 

文件内查找和替代

代码中经常会做查找和替代的操作。如果只是查找。直接按command+f,代码的右上角会出现对话框:

image

在里面输入关键字,不论大小写,代码中所有命中的文字都高亮显示。

image

可以做更复杂的查找,比如是否大小写敏感,是否使用正则表达式等等。

可以切换到替代界面:

image

下面的界面,我是将查找设置为大小写敏感,然后替代为myBook:

image

可点击按钮是否全部替代,还是查找一个替代一个等。

 

项目内查找和替代

如果需要在整个项目内查找和替代:

image

还是找关键字book:

image

替代就不说了,如何操作一看便知。

 

作用域内编辑

比如:

image

我想把局部变量myBook改回成book。那么可以用到这个功能。首先要鼠标选中变量:

image

然后:

image

这时会看到: 
image

直接修改变量名,发现所有该变量名同时跟着改变了:

image

 

重构代码

重构(refactor)的概念这里不展开说了。读者可参考专门的论述。这里只举具体例子。比如修改类的名称,就是一种重构行为。Xcode提供了这方面的支持。

比如想把Book类改为GeneralBook类。首先要把光标放在类的头文件或者m文件的标注部位:

image

然后:

image

然后:

image

点击preview,可以预览改动的内容:

image

一般要保持snapshot的勾选,这样重构操作会生成快照,便于重构错误后的恢复。

点击apple,重构将执行。

 

快速定位到代码行

可以:

image

定位光标到选中文件的行上。一般会用快捷键,command+L。使用菜单或者快捷键,都会出现下面的对话框,输入行号,回车,就会到该文件的指定行。

image

 

快速打开文件

有时候,我们想快速打开头文件,比如:

image

这里的Cocoa.h到底是啥内容。可以鼠标选中Cocoa.h,如上图。然后:

image

这时会弹出对话框:

image

双击Cocoa.h条目就可以看到了:

image

另外,还有个更方便的操作,针对头文件的,就是按住command键鼠标双击类型(函数、变量等)名称。会在源代码窗口中显示该类型的头文件。

 

使用书签

以前在使用Eclipse,我经常用到TODO标签功能,比如正在编写代码的时候需要做其他事情,或者提醒自己以后再实现的功能,就写个TODO注释,这样,可以在Eclipse的视图中可以找到,方便以后找到这个代码并修改。

Xcode中是否有相应的功能呢?我现在觉得书签功能可以做类似的事情。

比如我写了个代码:

image

这个方法是空的,printInfomation。暂时不需要实现。但是要记下来,便于以后能找到并补充。那么让光标在方法内部。然后鼠标右键,Add to Bookmarks:

image

然后会弹出对话框,在里面填写标签的内容,比如:

image

这样,就可以在项目的书签节点找到这个条目了:

image

点击该条目,将回到刚才添加书签时光标的位置。

 

自定义导航条

在代码窗口上边,有一个工具条。提供了很多方便的导航功能。比如:

image

也可以用来实现上面TODO的需求。这里有两种自定义导航条的写法。其中:

#pragma mark

是标准写法。而:

// TODO: xxx

// FIXME: xxx

是Xcode兼容的格式。

完整的代码:

image

产生了这样的导航条效果:

image

 

使用Xcode帮助

如果想快速的查看官方API文档,可在源代码中按下option键并鼠标双击该类型(函数、变量等),比如,下面是NSString的API文档对话框:

image

如果点击上面标识的按钮,则会弹出完整文档的窗口:

image

 

调试代码

最朴素的调试方法,是通过NSLog打印出程序运行中的结果,然后根据这些结果判断程序运行的流程和结果值是否符合预期。对于简单的问题,使用这种方式也许就够用了。

但是,如果开发的是商业项目,它往往足够复杂,需要借助Xcode提供的专门调试工具。所有的编程工具的调试思路都是一样的。首先,你要在代码中设置断点。想象一下,程序的执行是顺序的,你可能怀疑某个地方的代码除了问题(引发bug),那么就在这段代码开始的地方,比如是个方法的第一行,或者循环的开始部分,设置一个断点。那么程序在调试时会在运行到断点时中止,接下来,你可以一行一行的执行代码,判断执行顺序是否是自己预期的,或者变量的值是否和自己想的一样。

设置断点很简单,比如想对红框表示的行设置断点,就单击该行左侧红圈位置:

image

单击后会出现断点标志:

image

然后,运行代码,比如用快捷键:command+enter。这时将运行代码,并停止在断点处:

image

可通过shift+command+y,调出调试对话框:

image

这和其他语言IDE工具的界面大同小异,因为都具有类似的功能。可通过:

  • continue,继续执行程序
  • step over, step into, step out,用于单步调试,分别表示:
    • step over:将执行当前方法内的下一个语句
    • step into:如果当前语句是方法调用,将单步执行当前语句调用方法内部第一行
    • step out:将跳出当前语句所在方法,到方法外的第一行

通过调试工具,可以对应用做全面和细致的调试。


<think>好的,用户现在想了解如何使用Py2app和Rubicon-ObjC将Python应用打包到iOS。首先,我需要回顾之前的对话,确保回答的一致性。用户之前询问了在iOS上使用Python开发的方法,我提到了Pyto、Kivy/BeeWare以及Py2app/Rubicon-ObjC三种方案。现在用户具体问到了第三种方案,即Py2app和Rubicon-ObjC使用方法。 首先,我需要明确Py2app和Rubicon-ObjC各自的角色。Py2app主要用于将Python应用打包成macOS应用,而Rubicon-ObjC则是Python与Objective-C的桥接库,允许Python调用iOS的API。但用户的问题是关于iOS打包,这有点复杂,因为iOS应用通常需要Xcode和Swift/Obj-C开发,而Py2app本身可能不支持直接生成iOS应用。这可能意味着用户需要结合其他工具,比如BeeWare的Briefcase或者手动配置Xcode项目。 接下来,我需要参考用户提供的引用内容。引用[1]提到了Pythonista,但用户现在的问题是关于Py2app和Rubicon-ObjC,所以可能不直接相关。引用[2]提到BeeWare的Briefcase工具,这可能与打包有关,但用户明确提到了Py2app和Rubicon-ObjC。引用[3]涉及iOS应用中嵌入Python脚本,这可能与Rubicon-ObjC使用场景相关,但需要进一步分析。 用户的实际需求是使用Py2app和Rubicon-ObjC将Python应用打包到iOS。但根据我的知识,Py2app主要用于macOS,而非iOS。所以可能需要解释这一点,并建议替代方案,比如使用BeeWare的Briefcase或其他工具。不过,用户特别提到了这两个库,所以需要找到它们如何在iOS开发中协同工作的方法。 可能的解决方案是使用Rubicon-ObjC来桥接Python和Objective-C代码,然后通过Xcode将Python代码嵌入到iOS项目中,并手动处理依赖和打包。这需要详细步骤,比如创建Xcode项目,配置Python环境,使用Rubicon-ObjC调用iOS API,然后通过Py2app或类似工具打包资源。 此外,需要注意Py2app可能不直接支持iOS,因此可能需要调整步骤,比如使用setup.py配置,但最终可能需要Xcode来构建iOS应用。同时,需要处理Python到Obj-C的桥接,内存管理,以及确保所有依赖项正确包含在应用包中。 还需要提到潜在的限制,比如性能问题、App Store审核问题,以及依赖管理的复杂性。用户可能需要了解这些挑战,并在开发过程中注意。 最后,确保回答结构清晰,分步骤说明,并提供示例代码和命令,帮助用户实际操作。同时,生成的相关问题需要与主题紧密相关,比如如何调用特定API,如何处理内存管理,或如何优化性能等。</think>#### 一、Py2app与Rubicon-ObjC的核心作用 1. **Py2app的定位** - 原生为macOS设计的Python应用打包工具,可将Python代码及其依赖封装为独立应用(`.app`格式)。 - 在iOS开发中需结合Xcode手动调整,**不支持直接生成iOS应用包**,但能辅助管理Python依赖[^2]。 2. **Rubicon-ObjC的核心功能** - 提供Python与Objective-C的双向桥接,允许: - 调用iOS原生API(如UIKit、CoreLocation) - 实现Python类继承Objective-C类 - 处理Objective-C内存管理(通过ARC自动引用计数)[^2]。 --- #### 二、iOS开发中的整合步骤(Xcode+Python方案) 1. **环境准备** - 安装Xcode(需macOS系统) - 配置Python虚拟环境并安装工具链: ```bash $$ pip install rubicon-objc py2app $$ ``` 2. **创建桥接模块**(以调用UIKit为例) ```python # ios_bridge.py from rubicon.objc import ObjCClass, objc_method import sys # 定义Objective-C兼容的Python类 class AppDelegate(metaclass=objc_method): @objc_method def applicationDidFinishLaunching_(self, notification): UIWindow = ObjCClass('UIWindow') self.window = UIWindow.alloc().init() self.window.makeKeyAndVisible() return True ``` 3. **Py2app配置适配** ```python # setup.py from setuptools import setup APP = ['main.py'] # 主入口文件 DATA_FILES = [('Resources', ['ios_bridge.py'])] OPTIONS = { 'argv_emulation': True, 'packages': ['rubicon'], 'resources': ['Assets.xcassets'] # iOS资源文件 } setup( app=APP, data_files=DATA_FILES, options={'py2app': OPTIONS}, setup_requires=['py2app'], ) ``` 4. **Xcode项目集成** - 将Py2app生成的`.app`包拖入Xcode项目的`Resources`目录 - 在`Info.plist`中添加Python解释器路径: ```xml <key>LSEnvironment</key> <dict> <key>PYTHONHOME</key> <string>@executable_path/../Resources</string> </dict> ``` --- #### 三、关键问题与解决方案 | 问题类型 | 现象描述 | 解决方案 | |------------------|------------------------------|--------------------------------------------------------------------------| | 动态库加载失败 | `dyld: Library not loaded` | 在Xcode的`Build Phases`中添加`@loader_path`到`Runpath Search Paths`[^3] | | 内存管理冲突 | EXC_BAD_ACCESS错误 | 使用`@autoreleasepool`装饰器管理Python-Objective-C对象生命周期[^2] | | API版本不匹配 | UIKit方法未找到 | 通过Rubicon动态调用Objective-C运行时方法:`ObjCClass('UIView').new()` | --- #### 四、性能优化建议 1. **减少跨语言调用**:将高频操作封装为Objective-C静态库供Python调用 2. **预编译Python字节码**:通过`python -m compileall`提升启动速度 3. **资源压缩**:使用`xcrun`工具链压缩图片和脚本资源 --- #### 五、方案局限性 1. **应用体积膨胀**:基础Python环境会使IPA包增加约30-50MB 2. **App Store审核风险**:需证明Python解释器的必要性(如科学计算类应用)[^3] 3. **功能受限**:部分敏感API(如FaceID)无法通过桥接层访问 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值