Leopard 的 Garbage Collection

從 10.5 Leopard 開始,Mac OS X 開始支援 Objective-C 2.0 語言,其中一項賣點就是支援一套 Garbage Collection 系統。於是,以後寫 Obj-C 程式的時候,就不用注意每一個產生的物件到底是會 autorelease 還是要自己 release,不用注意是不是有哪些物件忘記 release,從此寫程式不用顧及記憶體的問題,世界從此又變得更為光明美好…

才怪。

這兩天的測試結果,大概發現了幾件事情:首先,雖然 Leopard 支援 GC,但是系統中大部份的應用程式,還是透過非 GC 的方式寫出來的,但是,就是有軟體是用 GC 狀態下寫的,例如 Xcode 3,在這類的軟體中,就會出現這樣的問題:在 Leopard 上面編成了使用 GC 的應用程式,也只能夠載入透過 10.5 SDK 編譯出來的各種 plugin,而如果 plugin 裡頭又用到了非 GC 的 Class,那麼,這個 plugin,就足以造成應用程式 crash…。

就拿 Xcode 3 來說好了。基本上,Xcode 3 也不能夠載入多少 plugin,但是我偏偏寫了一個可以讓 Xcode 3 載入的 plugin,就是前面說到的 ColorBy.ColorPicker 這個 Color Picker;而一般來說,寫程式好像也不太需要一天到晚挑顏色,但是我這個 Color Picker 就好死不死,就是打算寫給 Xcode 用的。而如果你妄想著這一個 Color Picker 還可以在 Tiger 上與 Leopard 上都可以使用,所以用 10.4u SDK 編,你可以在所有其他應用程式中看到你的 Color Picker,但,很抱歉,就是不會出現在 Xcode 3 裡頭。

至於在 Leopard 上面,可能在程式裡頭,用到什麼哪些沒有支援 GC 的東西呢?至少 IKImageFlowView 就不支援;換言之,如果你想要在 Color Picker 上面做出 Color Flow 效果,就等著在某些應用程式裡頭爆炸。而 Apple 官方也只有在 Finder 與 iTunes 裡頭用到 Cover Flow,也就是,官方也還只有在 Carbon 程式裡頭用 Cover Flow 啊…。

(順道一提。想來,Color Picker 也應該能夠拿來做一些有趣的壞事,在整個作業系統中,可以在所有應用程式裡頭都用到的東西,除了輸入法之外,就是 ColorPicker。)