Objective-C 一些很基礎的總結


學習 Objective-C大概4個月了,居然給一個還沒畢業的家伙吹了吹,呼,希望不要誤人子弟。這里總結一下,畢竟這是第一次完整的講一個東西。

附上PPTObjective-C Primary 。資源99%來自WWDC 2010 session 113。

Common Concepts

Objective-C 相對其他更了解的C++語言來說,還是有些不同的。如下表

 

image

這里面有幾點比較重要

  1. Objective-C 中所有的類,其實是另一種“類”的對象,所以Objective-C 中的類方法,其實是另一種類的實例方法。 Objective-C Message
  2. Objective-C 中沒有靜態變量,都是用全局變量實現的。

Category

如何給一個類增加一個函數方法,在C++中是不可能的(或是很難)但是在Objective-C中確實很簡單的事情,category 做的就是這件事情。

當第一次看到category 時,我幾乎肯定這是一個非常坑爹的設計,因為這個可以完美的覆蓋原有類的方法,如果使用不當,絕對是災難性的錯誤。但是,隨着使用時間變長category 的好處也慢慢體會出來。

  • 給系統原有的類或是第三方的類增加函數,而不用使用一個新的類,這樣使用會更加方便,特別是使用IB時,不需要將系統的類換成自己定義的類,這樣減少了非常多的移植問題和同步工作。

當然,如果使用不當,也會遇到問題

  • 函數覆蓋問題,之前提到過
  • 增加大量的category 會降低系統性能,特別是如果大量的加到一些基礎類上,如NSObject 等,因為,幾乎整個系統都在使用這些類,而過多的category,不僅降低自己代碼的效率,也會降低framework代碼的效率,這里的效率,應該主要在類初始化上,和消息發送上面。

SEL

Memory Management

語言是離不開平台的,而內存管理,則是了解平台中最基礎的部分。而cocoa touch 的內存設計也就是基於引用計數的設計,是針對很早以前的設備設計,顯然不適合現在的硬件設備。但是,現在我們似乎沒有其他的選擇,在一開始學習時。

基於引用計數的內存管理,設計的本質其實就是一個Directed Acyclic Graph(有向無回圖)

image

對於引用計數的內存管理,這一點實在是不陌生,不管是什么語言,都會遇到一個問題,循環引用

image

當形成回路時,循環引用發生,導致內存泄露。而對應的方法,不管是什么語言,都需要把引用分為強引用和弱引用

image

解決引用循環的方法很多,但是實質上,都是通過抽象成父子關系來做,一個強引用,一個弱引用,圖形下方的節點通過弱引用連接上面的節點,圖形上方的節點,通過強引用連接下方節點。實例就是delegate,屬性被聲明為assign

Autorelease Pools

autorelease 應該是初學者最容易糊塗的地方,一開始我也非常害怕使用Autorelease 變量,因為,這些變量不僅會增大內存開銷,而且使用不當,crash的位置就是main函數,調試器幾乎沒有任何幫助,但是仍然有非常多的framework是基於autorelease 變量的,所以還是需要屢屢。

cocoa touch 是事件驅動的,我們通過接受一個個的event來跑我們的程序,那么簡單的講,就是一個while的死循環,不斷地獲取一個event,處理一個event。

image

處理event的時候,framework 幫我們建立了一個autorelease pool。

image

當我們處理或是叫響應一個event時,比如調用了[NSDate date] 函數,這個函數,返回了一個autorelease 變量d

而這個變量,事實上是被autorelease pool 所引用。

image

當一層層stack pop 之后,我們可以看到 autorelease 變量的生命周期

image

image

當調用[pool drain]后,autorelease pool 隨之消失,伴隨着還有那個var d,回到原點,在下一個event cycle

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM