唐巧的博客

深入理解Tagged Pointer
版权说明本文为 InfoQ 中文站特供稿件,首发地址为:文章链接。如需转载,请与 InfoQ 中文站联系。 【摘要】:为了节省内存和提高执行效率,苹果提出了Tagged Pointer的概念。对...
用CocoaPods做iOS程序的依赖管理
文档更新说明 2012-12-02 v1.0 初稿 2014-01-08 v1.1 增加设置 ruby 淘宝源相关内容 2014-05-25 v2.0 增加国内 spec 镜像、使用私有 p...
iOS应用安全开发概述
【摘要】:iOS 应用由于其直接运行在手机上,相比运行在服务器的后台服务,更有可能被黑客攻击。本文将从网络安全、本地文件和数据安全、源代码安全三个方面,阐述 iOS 应用在安全性上遇到的挑...
专门针对越狱iOS设备的盗号木马出现
关于木马今天,国外的 iOS 开发者 @iOn1c 发现一个来自中国的开发者 “WANG XIN” 签名的 iOS 平台的木马插件,该插件是一个名为Unflod.dylib动态链接库,可以将...
从 Facebook 看移动开发的发展
从 Facebook 谈起Facebook 最近绝对是互联网界的新闻明星。它首先是进行了大手笔的收购:2014 年 2 月,Facebook 以 160 亿美元现金加股票,以及 30 亿美元...
NSNumber对象缓存以及Tagged Pointer
这是一次和 @onevcat 的技术讨论总结。技术点比较散,但是还都比较有意思。涉及的技术细节包括: 系统对象的缓存 Tagged Pointer对象 讨论一:autorelase对象按照苹...
ReactiveCocoa - iOS开发的新框架

本文为 InfoQ 中文站特供稿件,首发地址为:文章链接。如需转载,请与 InfoQ 中文站联系。

什么是 ReactiveCocoa

ReactiveCocoa(其简称为 RAC)是由 Github 开源的一个应用于 iOS 和 OS X 开发的新框架。RAC 具有函数式编程和响应式编程的特性。它主要吸取了 .Net 的 Reactive Extensions 的设计和实现。

ReactiveCocoa 试图解决什么问题

经过一段时间的研究,我认为 ReactiveCocoa 试图解决以下 3 个问题:

  1. 传统 iOS 开发过程中,状态以及状态之间依赖过多的问题
  2. 传统 MVC 架构的问题:Controller 比较复杂,可测试性差
  3. 提供统一的消息传递机制
非换行空格在CoreText排版上的问题

分享一个在使用 Core Text 时遇到的问题。

问题描述

我们的猿题库界面因为有图片、公式需要混排,所以用的是 Core Text 实现的排版。

在使用中,发现一些英文题目的换行方式不对,
我们设置的是按单词换行,但是总是有些题目的换行并不是按单词的,造成显示上比较错乱,如下图所示。图中 unchangeable, study, falls 三个单词都被生生截断了,造成阅读上的不适。

Xcode Debugger中的Icon符号的意义

你注意到了吗?在 Xcode 中,当你点击查看调用栈的时候,调用栈的每个方法前面都有一个 Icon,而且还有好几种不同的样子,如下图所示,你知道它们代表什么意思吗?

iOS开发工具-网络封包分析工具Charles

更新

本部分的内容写于2013年12月,2015年11月有更新,更新版的文章见:《Charles 从入门到精通》

简介

本文为 InfoQ 中文站特供稿件,首发地址为:文章链接。如需转载,请与 InfoQ 中文站联系。

Charles 是在 Mac 下常用的截取网络封包的工具,在做 iOS 开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析。Charles 通过将自己设置成系统的网络访问代理服务器,使得所有的网络访问请求都通过它来完成,从而实现了网络封包的截取和分析。

Charles 是收费软件,可以免费试用 30 天。试用期过后,未付费的用户仍然可以继续使用,但是每次使用时间不能超过 30 分钟,并且启动时将会有 10 秒种的延时。

因此,该付费方案对广大用户还是相当友好的,即使你长期不付费,也能使用完整的软件功能。只是当你需要长时间进行封包调试时,会因为 Charles 强制关闭而遇到影响。

Charles 主要的功能包括:

  1. 支持 SSL 代理。可以截取分析 SSL 的请求。
  2. 支持流量控制。可以模拟慢速网络以及等待时间(latency)较长的请求。
  3. 支持 AJAX 调试。可以自动将 json 或 xml 数据格式化,方便查看。
  4. 支持 AMF 调试。可以将 Flash Remoting 或 Flex Remoting 信息格式化,方便查看。
  5. 支持重发网络请求,方便后端调试。
  6. 支持修改网络请求参数。
  7. 支持网络请求的截获并动态修改。
  8. 检查 HTML,CSS 和 RSS 内容是否符合 W3C 标准
使用Flurry来统计和分析用户行为

2015年11月更新

由于 Flurry 的后台在中国访问实在太慢,另外 Flurry 对中国区的 IP 类型判断不太准确(3G和Wifi无法准确区分),所以我现在不再推荐大家使用 Flurry 了。

不用 Flurry 之后,我们现在使用的是腾讯的 MTA 来做统计。

简介

本文为 InfoQ 中文站特供稿件,首发地址为:文章链接。如需转载,请与 InfoQ 中文站联系。

Flurry是一家专门为移动应用提供数据统计和分析的公司。他们的数据统计分析SDK支持的平台包括iPhone, iPad, Android, Windows Phone, Java ME和BlackBerry。使用Flurry服务的公司包括eBay、Yahoo、Hulu和Skype等超过11万家公司,涉及的应用超过36万个。

利用Flurry提供的分析平台,我们可以很容易地自动统计出应用的使用情况,例如:

  1. 每天(每周或每月)登录用户数,应用使用次数
  2. 每天(每周或每月)新用户数,活跃用户数
  3. 用户的所在地、年龄、性别的分布情况

Flurry也可以自动统计出移动设备的分类情况,例如:

  1. 使用3G,Wifi的会话比例
  2. 使用iOS系统各版本(例如iOS6.0, iOS7.0等)的比例
  3. 使用iOS各种设备(例如iPhone4, iPhone5等)的比例

除了上面介绍的自动统计项目,Flurry SDK也提供了统计用的相关API,便于我们针对自己产品的特点,做针对性的统计。例如统计应用中某个按钮的按下次数,或者网络请求的平均响应时间等。

猿题库iOS客户端的技术细节(二):答题卡扫描算法

前言

本人今年主要在负责猿题库 iOS 客户端的开发,本文旨在通过分享猿题库 iOS 客户端开发过程中的技术细节,达到总结和交流的目的。

这是本技术分享系列文章的第二篇。本文涉及的技术细节是:答题卡扫描算法。

猿题库iOS客户端的技术细节(一):使用多target来构建大量相似App

前言

本人今年主要在负责猿题库 iOS 客户端的开发,本文旨在通过分享猿题库 iOS 客户端开发过程中的技术细节,达到总结和交流的目的。

这是本技术分享系列文章的第一篇。本文涉及的技术细节是:采用多 Target 编译方案来实现多个相似 App 的开发,以保证我们能够快速地推出多个相似课程的客户端。

Objective-C对象模型及应用

前言

原创文章,转载请注明出自 唐巧的技术博客

本文主要介绍 Objective-C 对象模型的实现细节,以及 Objective-C 语言对象模型中对isa swizzlingmethod swizzling的支持。希望本文能加深你对 Objective-C 对象的理解。

ISA 指针

Objective-C 是一门面向对象的编程语言。每一个对象都是一个类的实例。在 Objective-C 语言的内部,每一个对象都有一个名为 isa 的指针,指向该对象的类。每一个类描述了一系列它的实例的特点,包括成员变量的列表,成员函数的列表等。每一个对象都可以接受消息,而对象能够接收的消息列表是保存在它所对应的类中。

在 XCode 中按Shift + Command + O, 然后输入 NSObject.h 和 objc.h,可以打开 NSObject 的定义头文件,通过头文件我们可以看到,NSObject 就是一个包含 isa 指针的结构体,如下图所示:

动态下载苹果提供的多种中文字体

引言

在今年 WWDC 的内容公开之前,大家都以为 iOS 系统里面只有一种中文字体。为了达到更好的字体效果,有些应用在自己的应用资源包中加入了字体文件。但自己打包字体文件比较麻烦,原因在于:

1、字体文件通常比较大,10M - 20M 是一个常见的字体库的大小。大部分的非游戏的 app 体积都集中在 10M 以内,因为字体文件的加入而造成应用体积翻倍让人感觉有些不值。如果只是很少量的按钮字体需要设置,可以用一些工具把使用到的汉字字体编码从字体库中抽取出来,以节省体积。但如果是一些变化的内容需要自定义的字体,那就只有打包整个字体库了。

2、中文的字体通常都是有版权的。在应用中加入特殊中文字体还需要处理相应的版权问题。对于一些小公司或个人开发者来说,这是一笔不小的开销。

以上两点造成 App Store 里面使用特殊中文字库的 iOS 应用较少。现在通常只有阅读类的应用才会使用特殊中文字库。

但其实从 iOS6 开始,苹果就支持动态下载中文字体到系统中。只是苹果一直没有公开相应的 API。最终,相应的 API 在今年的 WWDC 大会上公开,接下来就让我们来一起了解这个功能。

谈Objective-C block的实现

前言

这里 有关于 block 的 5 道测试题,建议你阅读本文之前先做一下测试。

先介绍一下什么是闭包。在 wikipedia 上,闭包的定义 是:

In programming languages, a closure is a function or reference to a function together with a referencing environment—a table storing a reference to each of the non-local variables (also called free variables or upvalues) of that function.

翻译过来,闭包是一个函数(或指向函数的指针),再加上该函数执行的外部的上下文变量(有时候也称作自由变量)。

block 实际上就是 Objective-C 语言对于闭包的实现。
block 配合上 dispatch_queue,可以方便地实现简单的多线程编程和异步编程,关于这个,我之前写过一篇文章介绍:《使用 GCD》

本文主要介绍 Objective-C 语言的 block 在编译器中的实现方式。主要包括:

  1. block 的内部实现数据结构介绍
  2. block 的三种类型及其相关的内存管理方式
  3. block 如何通过 capture 变量来达到访问函数外的变量
分析支付宝客户端的插件机制

前言

因为开了 iOSDevTips 的微信公共账号,老收到各种 iOS 开发的问题,前两天收到一个问题的内容是:

请问像支付宝钱包那样可以在应用里安装自己的应用,是已经在应用里写了逻辑,还是可以向应用里发送代码 ?

我觉得这个问题挺有意思的,估计大家都感兴趣,所以今天就抽空研究了一下,将支付宝客户端的插件机制具体实现方式介绍给大家。

先介绍一下该插件机制,如上图所示,支付宝客户端在安装后,对于像 “彩票”、“爱心捐赠” 这类功能,需要再点击安装一次,然后才可以使用。有些时候该插件功能进行了升级,需要点击升级才可以继续使用。插件的方式有利于软件动态增加新的功能或升级功能,而不用再一次向 AppStore 提交审核。另外,由于用户不需要的插件可以不用安装,也缩小了应用本身的体积大小,节省了下载流量。

iOS开发工具篇-AppStore统计工具

本文首发于 InfoQ,本文版权归 InfoQ 所有,转载请保留 原文链接

前言

随着 iOS 开发的流行,针对 iOS 开发涉及的方方面面,早有一些公司提供了专门的解决方案或工具。这些解决方案或工具包括:用户行为统计工具(友盟,Flurry,Google Analytics 等), App Store 销售分析工具(例如 App annie), App crash 收集工具(例如 Crashlytics),App 测试发布工具(Test Flight), App Push 服务等。

这些解决方案或工具节省了 iOS 开发者大量的开发时间,但是由于相关介绍文章的缺乏,许多开发者都在重复着自己一次又一次重新造轮子。所以我希望,将我自己使用和调研的相关的第三方服务使用经验,整理成一系列文章,以便广大开发者能够省去大量的重复性工作。

今天介绍 AppStore 统计工具:App Annie 和苹果的命令行统计工具。

历史上的WWDC门票售空图片
2008年62天售空。介绍了iPhone 3G。 2009年33天售空。介绍了iPhone 3GS。 2010年8天售空。介绍了iPhone 4。 2011年12小时售空。介绍了iO...
那些被遗漏的Objective-C保留字

今天翻到很久以前自己在网易博客上写的 这篇文章,惊奇地发现自己都忘记了里面的一些内容。所以我又重新学习了一下,然后改了改内容,挪到这里。

前言

Steffen Itterheim《Learn Iphone and Ipad Cocos2d Game Development》 作者。cocos2d 和 cocos2d-x 现在已成为著名的游戏开发引擎。在 AppStore 上有超过 100 个游戏是基于 Cocos2D。

Steffen Itterheim 在 他的博客 中总结了 Objective-C 2.0 所有的编译器保留字,并且对这些保留字做了介绍和使用示例。这些保留字如下:

@class
@defs
@protocol @required @optional @end
@interface @public @package @protected @private @property @end
@implementation @synthesize @dynamic @end
@throw @try @catch @finally
@synchronized @autoreleasepool
@selector @encode
@compatibility_alias
@”string”

我把这些保留字过了一遍,发现很少用到的有 @dynamic @defs @encode @compatibility_alis,所以就给大家介绍一下这几个关键字吧。

iOS应用内支付(IAP)的那些坑

前言

udacity 中的在线课程 《How to build a startup》 中提到,所谓创业,就是尝试寻找新的赢利模式。正因为这是一种尝试,所以不可避免地需要调整产品方向,寻找市场中还未被发现的用户需求,给用户创造价值,进而获得收入。最近很火的 精益创业 的观点,则是强调将这种尝试成本降到最小,使得自己可以根据市场反馈迅速调整产品。

我们在今年春节后上线了新的在线智能题库:猿题库。这应该是我们在互联网教育这个创业领域尝试的第二个方向。

猿题库现在推出了公务员考试行测和申论 2 个产品,均包括 web, iOS 和 Android 三个平台。这次我们尝试做一个收费的产品,所以在 iOS 端集成了应用内支付(IAP)功能。在开发过程中和上线后,我们遇到了 IAP 中的一些坑,在此分享给各位。

是否应该使用ARC?

我和身边做 iOS 开发的同事组建了一个 QQ 群,每隔一段时间,大家就会讨论是否应该使用 ARC。所以我觉得有必要将这些讨论分享出来,让大家消除对于 ARC 的疑虑。

设置应用内的系统控件语言

在iOS应用中,有时候会需要调用系统的一些UI控件,例如:

  1. 在UIWebView中长按会弹出系统的上下文菜单
  2. 在UIImagePickerController中会使用系统的照相机界面
  3. 在编译状态下的UITableViewCell,处于待删除时,会有一个系统的删除按钮。

以上这些UI控件中,其显示的语言并不是和你当前手机的系统语言一致的。而是根据你的App内部的语言设置来显示。结果就是,如果你没有设置恰当的话,你的中文App可能会出现一些英文的控件文字。

谈ObjC对象的两段构造模式

前言

Objective-c 语言在申请对象的时,需要使用两段构造 (Two Stage Creation) 的模式。一个对象的创建,需要先调用 alloc 方法或 allocWithZone 方法,再调用 init 方法或 initWithSomething 方法。如下是一个 NSString 对象的创建示例:

NSString * str = [[NSString alloc] initWithString:@"http://blog.devtang.com"];

由于该语言的对象创建方法和大多数其它语言(如 C、C++、Java、JavaScript)都不一样,所以引起了我的好奇。是什么原因促使 Objective-C 做了这种设计,而又是什么原因促使大多数其它语言都采用 “new” 方法来一次性创建对象呢?

在看了 《Cocoa Design Patterns》 一书(顺便吐槽一下该书中文版翻译质量不高,建议看英文版),并且做了一些调研之后,我将总结分享给大家,欢迎大家讨论。

StoryBoard--看上去很美

介绍

StoryBoard 是苹果在 2011 年的 WWDC Session 309《Introducing Interface Builder Storyboarding》中介绍的 Interface Builder 的新功能。其基本想法是将原本的 xib 进行升级,引入一个容器用于管理多个 xib 文件,并且这个容器可以通过拖拽设置 xib 之间的界面跳转。而这个容器就是被苹果称做的 StoryBoard。下图是一个 Storyboard 的截图。

关于IAP的破解

介绍

大概在今年7月份,有俄罗斯黑客破解了苹果的应用内付费(In-App Purchases),设备在不越狱的情况下就可以免费获得来自苹果官网App Store里应用的收费道具。受影响的产品众多,包括著名的Angry Birds,切水果,Mega Jump, Pandora等。这里有一份受影响的著名的游戏应用列表。

正常的越狱行为还是比较复杂的,需要下载破解软件,并且操作进入DFU模式,所以大部分人并不能够方便地越狱。但该方案不需要越狱就可以破解应用内付费,给用户实施该行为提供了方便。

iOS应用内付费(IAP)开发步骤列表

前两天和服务端同事一起,完成了应用内付费(以下简称IAP, In app purchase)的开发工作。步骤繁多,在此把开发步骤列表整理如下。因为只是步骤列表,所以并不含详细的说明教程,需要看教程的新手,可以看我附在最后的一些参考链接。

让Xcode的 stack trace信息可读

昨天在写 iOS 代码的时候,调试的时候模拟器崩溃了。异常停在了如下整个 main 函数的入口处:

int main(int argc, char *argv[])
{
@autoreleasepool {
// 异常停在了下面这行,毫无提示作用
return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyClass class]));
}
}

改进iOS客户端的升级提醒功能

功能设计

先申明一下,我是码农,不是一个产品经理,但我觉得现有市面上的很多 App,设计的 “升级提示功能” 都不太友好。在此分享一下我的想法,欢迎大家讨论。

这些 App 包括:新浪微博、网易微博、网易新闻客户端以及大部分带有升级提示功能的 App,所以我觉得这个问题还是挺普遍的。对于该问题,一句话描述起来就是:“这些 App 都会在用户刚刚使用它的时候,提示有新版本,让用户去 AppStore 上下载最新的版本”。下面是某个应用的升级提示截图:

为什么我认为这是一个糟糕的设计呢?因为用户刚刚打开你的 App,明显就是想使用你的功能。例如刚刚打开新浪微博,可能就是想看一下最新的消息或回复。刚刚打开网易新闻客户端,可能就是想看看最新的新闻。这个时候,你告诉用户有新版本,是想让用户暂时放弃使用该 App 吗?我不知道有多少用户会去点 “升级” 这个按钮,反正我每次看到这个提示都很郁闷,因为我如果点了,我就暂时不能使用该应用了(升级时原版本的 App 是无法使用的)。所以我在想,这个提示升级的时间能不能做得更友好一些?

在MacOS和iOS系统中使用OpenCV

前言

OpenCV 是一个开源的跨平台计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法。

最近试着在 MacOS 和 iOS 上使用 OpenCV,发现网上关于在 MacOS 和 iOS 上搭建 OpenCV 的资料很少。好不容易搜到些资料,却发现由于 OpenCV 和 Xcode 的版本更新,变得不再有用了。有些问题费了我很多时间,在此总结分享给大家,希望后来人少走些弯路。

可以预见到,随着 Xcode 和 OpenCV 的版本更新,本文可能不再有效了。

所以特此注明,文本介绍的搭建方法仅针对于 Xcode4.5.1 和 OpenCV 2.4.2 版本。

(2013-6-22)更新: 我在 Xcode4.6.2 和 OpenCV 2.4.5 版本的时候重新进行了一次环境搭建,以下内容做了相应调整,应该也是有效的。

用脚本来简化iOS美术同学的工作

问题

我们知道,在 iOS 开发中,为了使我们的 app 能够同时支持 iPhone 的 Retina 屏幕和普通屏幕,美术同学需要对 UI 设计稿中的每个元素进行 2 次切图。苹果要求对图片元素的命名分别为 name.png 和 name@2x.png,带 @2x 的表示是 Retina 屏幕的贴图,不带 @2x 的同名文件为普通屏幕的贴图。

我在开发的时候发现很难要求美术同学按照开发的要求来对图片命名。她们通常对于切图的命名是例如 * 登录按钮大 .png* ,* 登录按钮小 .png*, * 登录按钮按下大 .png* * 登录按钮按下小 .png* 这样的形式。于是,对这些文件按照苹果的要求进行重命名就成了我这个码农的一个体力活。

Objective-C的新特性

苹果在今年的 WWDC2012 大会上介绍了大量 Objective-C 的新特性,能够帮助 iOS 程序员更加高效地编写代码。在不久前更新的 Xcode4.4 版本中,这些新特性已经可以使用了。让我们看看这些新特性有哪些:

封装同步的UIActionSheet

问题

做 iOS 开发的同学想必都用过 UIActionSheet。UIActionSheet 可以弹出一个选择列表,让用户选择列表中的某一项操作。使用 UIActionSheet 非常简单,以下是一个简单的示例代码:

- (void)someButtonClicked {
UIActionSheet * sheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"ddd" destructiveButtonTitle:@"aaa" otherButtonTitles:@"bbb", @"ccc", @"ddd", nil];
sheet.destructiveButtonIndex = 1;
[sheet showInView:self.view];
}

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
int result = buttonIndex;
NSLog(@"result = %d", result);
}

但我个人在使用时,感觉 UIActionSheet 有以下 2 个问题:

在iOS开发中使用FMDB

前言

SQLite (http://www.sqlite.org/docs.html) 是一个轻量级的关系数据库。iOS SDK 很早就支持了 SQLite,在使用时,只需要加入 libsqlite3.dylib 依赖以及引入 sqlite3.h 头文件即可。但是,原生的 SQLite API 在使用上相当不友好,在使用时,非常不便。于是,开源社区中就出现了一系列将 SQLite API 进行封装的库,而 FMDB (https://github.com/ccgus/fmdb) 则是开源社区中的优秀者。

关于UIWebView的总结

前言

今天参加了 Adobe 和 CSDN 组织的一个关于 PhoneGap 的开发讲座 ,而 PhoneGap 在 iOS 设备上的实现就是通过 UIWebView 控件来展示 html 内容,并且与 native 代码进行交互的。

正好我们在做有道云笔记的 iPad 版,因为我们也是使用 UIWebView 来展示笔记内容,所以也需要做 js 与 native 代码相互调用的事情。所以在这儿顺便总结一下 UIWebView 在使用上的细节,以及谈谈我对 PhoneGap 的看法。

Xcode4 使用技巧

使用 xcode4 也有一段时间了,今天整理了一下 xcode4 的一些使用技巧,在这里分享给大家。

使用GCD

什么是 GCD

Grand Central Dispatch (GCD) 是 Apple 开发的一个多核编程的解决方法。该方法在 Mac OS X 10.6 雪豹中首次推出,并随后被引入到了 iOS4.0 中。GCD 是一个替代诸如 NSThread, NSOperationQueue, NSInvocationOperation 等技术的很高效和强大的技术。

GCD 和 block 的配合使用,可以方便地进行多线程编程。

给iOS工程增加Daily Build

前言

Daily Build 是一件非常有意义的事情,也是敏捷开发中关于 “持续集成” 的一个实践。Daily Build 对于开发来说有如下好处:

  • 保证了每次 check in 的代码可用,不会造成整个工程编译失败。
  • 进度跟进。产品经理可以每天看到最新的开发进度,并且试用产品,调整一些细节。很多时候,一个新功能,你真正用了一下才能有体会好或不好,所以 daily build 也给产品经理更多时间来调理他的设计。
  • 需求确认。产品经理可以确认开发的功能细节是他的预期。因为我们的开发比较紧凑,所以都没有传统的需求说明文档,所以 daily build 也给产品经理用于尽早确认开发的功能细节是他的预期,我就遇到一次产品经理发现开发出的一个功能细节和他的预期不一致,但是因为有 daily build,使得我可以尽早做修改,把修改的代价减小了。
  • 测试跟进。如果功能点是独立的话,测试同事完全可以根据 daily build 来进行一些早期的测试。越早的 Bug 反馈可以使得修改 bug 所需的时间越短。
给NSString增加Java风格的方法

我实在受不了 NSString 冗长的方法调用了,每次写之前都要查文档。特别是那个去掉前后多余的空格的方法,长得离谱。与之对应的别的语言,拿 java 来说,对应的方法名叫 trim。拿 python 来说,对应的方法名叫 strip。但是 Objective-C 呢?是下面这段:

[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
斯坦福大学 iOS 开发公开课总结

前言

iPhone 开发相关的教程中最有名的,当数斯坦福大学发布的 “iPhone 开发公开课 “ 了。此公开课在以前叫做《iPhone 开发教程》,今年由于平板电脑的流行,所以也加入了 ipad 开发相关的课程。在 网易公开课 上,有 该教程 的 2010 年录象,并且前面 15 集带中文字幕文件,非常适合初学者学习。

使用 Git 来管理 Xcode 中的代码片段

代码片段介绍

xcode4 引入了一个新 feature: code snippets,在整个界面的右下角,可以通过快捷键:cmd + ctrl + opt + 2 调出来。code snippets 是一些代码的模版,对于一些常见的编程模式,xcode 都将这些代码抽象成模版放到 code snippet 中,使用的时候,只需要键入快捷键,就可以把模版的内容填到代码中。

使用Objective-C的文档生成工具:appledoc

前言

做项目的人多了,就需要文档了。今天开始尝试写一些项目文档。但是就源代码来说,文档最好和源码在一起,这样更新起来更加方便和顺手。象 Java 语言本身就自带 javadoc 命令,可以从源码中抽取文档。今天抽空调研了一下 objective-c 语言的类似工具。

去掉Xcode源码末尾的空格
在用 Xcode 开发的时候,很容易就在行末增加一些空格了。这些空格在上传到 review board 上后 , 就会被特别的颜色显示出来。因为一种好的编程风格是说 , 不应该在行末增加不必要的...
让UILabel的文字顶部对齐
默认UILabel是垂直居中对齐的,如果你的UILabel高度有多行,当内容少的时候,会自动垂直居中。 如下图所示(图片来自stackoverflow): 比较郁闷的是,UILabel并不提...