利用CGRectDivide进行布局

在项目中由于不是使用 Storyboard 所以很多地方需要进行手动的布局,一些比较复杂的界面会让布局的代码变得很难维护,这时我们可以用 CoreGraphic 提供的一个函数 CGRectDivide来简化我们的布局代码:

利用 Cycript 调试 iOS 应用(无需越狱)

Cycript 是由大神 @saurik 开发的一套工具,它允许开发者在运行时探查和修改一个 iOS 或 Mac OS X 应用;它使用一种混合了 Objective-C++ 和 JavaScript 语法的脚本语言,你可以通过自带的一个 REPL (具备语法高亮和自动补全)进行操作。Cycript 的使用有两种方式,一种是在越狱设备上通过 MobileSubstrate 加载,好处是可以注入到 iOS 上的所有应用,具体的使用方法可以参考官方文档;还有一种是接下来要介绍的,通过其提供的静态库的方式将 Cycript 集成到自己的应用,从而避免越狱的需要(当然也只能在自己的应用内使用了)。

Compile-time Key Paths Verification

在使用 CoreAnimation 或 KVO 等API 的时候要需要指定一个 NSString类型的 keyPath 参数,通常的做法是直接传入一个字符串常量:

Y Combinator in Objective-C

相信接触过函数式编程的人都会为神奇的 Y Combinator 所着迷,它巧妙地解决了匿名函数递归调用的问题,在这篇文章我们将通过一个实际的例子用 Objective-C 来推导出 Y Combinator

Git and Github Secrets 筆記

"Git and Github Secrets" 是 Github 的Ben Homan在Aloha Ruby Conf 2012上的一個演講, 介紹了一些 Github 和 Git 鮮爲人知的技巧,下面是這個演講部分內容的筆記:

Cocoa 漢字轉拼音最簡單的方法

在開發中文應用的過程中,有時會與到需要將漢字轉爲拼音的需求,在網上搜索一下會發現不少這樣的庫,這些庫的實現多數是通過查表的方式,而且實現比較複雜,使用和維護不是很方便。其實,作爲幸福的 Cocoa 開發者,這項功能已經再 Core Foundation 的類庫中提供了,並且可以處理多種文字的轉譯,廢話少說,下面是代碼:

UIKit 收起鍵盤最方便的方法

在開發 iOS 程序時經常需要控制鍵盤的收起,一般我們都是通過 UITextField 的彈出鍵盤和 -resignFirstResponder 去觸發,但是這樣做有個缺點,就是需要用一個實例變量去記住當前的 TextField,這种給對象增加一個狀態(實例變量)的方法顯然不是很優雅。由於整個 Cocoa 的 UI 框架都中使用了響應者鍊(responder chain)的設計模式來實現事件傳遞,它在 AppKit 中是很強大的工具,但在 iOS 中卻相對少用,不過我們這裏就是利用它來現收方便地收起鍵盤。在 NSApplication 中有個 - (BOOL)sendAction:(SEL)anAction to:(id)aTarget from:(id)sender 方法,用來發送一個 action 消息到某個 target,但是這個方法如果 target 爲 nil 的話,那麼這個消息會從 firstResponder 開始沿着 responder chain 傳遞,直到有對象響應改消息爲止(AppKit 中 Menubar 和 Toolbar 就是利用這個原理實現的,隨着界面焦點的不同其選項的狀態也會變化,而且不需要寫很複雜的邏輯去處理)。我們這裏要用的是 UIApplication 對應的方法 - (BOOL)sendAction:(SEL)action to:(id)target from:(id)sender forEvent:(UIEvent *)event,然後,當你需要收起鍵盤的時候就只要這樣:

Xcode 4.3 MacRuby compatible problem workaround

Since Xcode 4.3 has became a standalone app, it's no longer installed in the /Developer directory. This cause the MacRuby project template disappear from Xcode 4.3. After some digging in the MacRuby-devel mailing list, I found some workaround to this problem:

Objective-C Runtime

之前在珠三角技术沙龙上一个关于Objective-C运行时的分享

Some Useful Bitwise Operations

  • Check if the integer is even

    (x & 1) == 0

Blocks

从Mac OS X 10.6 以及iOS 4 开始,苹果在Clang 编译器中为C语言引入了一个新扩展: Blocks,使得程序员可以在 C、Objective-C、C++ 和Objective-C 中使用闭包。Blocks 有点像函数,但是它可以在其它函数或方法中进行声明和定义,同时它还是匿名的(匿名函数),并可以捕获其所在作用域中的变量(闭包特性)。

retainCount 不会为 0

Objective-C 是通过引用计数的方式进行内存管理的,关于这种机制常听到这样一种说法: “当一个对象的的引用计数值减少到0时,它就会被 dealloc ”,这种说法看似有理,其实却是错的,因为一个对象的引用计数值永远不会为0!下面将从几个方面解释其原因:

如何記憶C語言中運算符的優先級

之前的一篇學習筆記,整理出來放到這裏.