標籤:c++ nsobject 成員 相容 引用 編程 pre code cti
Objective-C是一門簡潔、強大、靈活的既具有物件導向特性也具有函數式編程特性的程式設計語言。由於它是C語言的馬甲,也就是說,Objective-C可以將其原始碼先轉為純C語言然後再編譯為最終的目標代碼,所以我們也可以用它來寫純C語言代碼,它與C是完全相容的!(這點與C++在文法特性上跟C語言相容的特性不同)
由於有不少Objective-C愛好者對於ARC模式下的Objective-C感到十分困惑,所以希望能深入瞭解一下傳統非ARC模式下的編程法則。通過對非ARC模式Objective-C工作模式的認知,我們甚至可以對整個Cocoa Framework的運行核心做更深層的認知。為何我不推薦使用ARC模式呢?
你用了ARC就得去記__strong、__weak、__unsafe_unretained、__autoreleasing、__bridge等等雜七雜八的關鍵字~這些亂七八糟的概念本身會把你搞暈,而且當你半懂不懂的時候一旦亂用反而會產生各種奇怪的bug~這些玩意兒倘若充斥在你的代碼中,一來很醜,二來對於一些新手很容易被弄暈……所以說,ARC這貨自其出生就帶來了許多災難!
而反觀傳統的非ARC模式,property就一個assign,一個retain,NSObject裡就調用retain/release和autorelease方法~而且Apple對此的規則也非常簡單——“不是你建立的就不需要你釋放;是你建立的你才去釋放它。”這一句話就能解決所有問題~
除此之外,無論你用ARC還是非ARC,你都需要搞懂Apple Cocoa Framework的訊息迴圈機制,即autorelease是如何工作的。否則你的assign或weak屬性的Objective-C對象啥時候被釋放也都不會知曉~
綜上所述,如果為了編程方便、可維護、可擴充,我們完全可以把ARC編譯選項給關掉!另外,在Objective-C中往往把“方法調用”闡述為“訊息發送”。比如[obj msg]一般大家描述為obj對象調用其msg成員方法。而正式用語上應該描述為向obj對象發送msg訊息。在哪個對象的方法裡執行這條語句的,那麼稱該對象為訊息寄件者;msg稱為訊息(即方法);obj則稱為訊息接收者。講了那麼多,下面開始切入正題!
在基於Foundation/Cocoa Framework的Objective-C中,我們定義一個類往往需要繼承NSObject這一Foundation的基類。當我們調用NSObject的alloc類方法時,就會給要建立的對象分配儲存空間;然後緊接著調用NSObject的init成員方法對建立的對象做初始化。這裡就會對此對象做引用計數設定為1的操作。在基於Foundation/Cocoa Framework的Objective-C與傳統的C++不同,它全面通過為每一對象指定引用計數來確定其生命週期。當某個對象的引用計數被減到0時,會觸發調用該對象的dealloc成員方法。而上述的init方法就已經把對象的引用計數設定為1了。當我們調用NSObject的release成員方法時,該對象的引用計數減1。當我們調用NSObject的retain成員方法時,該對象的引用計數加1。通常,我們不要自己去重寫NSObject的release與retain成員方法
Objective-C關於非ARC模式下的對象引用計數