?

淺談Objective—C內存管理技術及應用

2014-10-21 19:57任艷
計算機光盤軟件與應用 2014年24期
關鍵詞:應用

摘 要:合理地內存管理機制能確保有效地管理內存資源。在Objective-C程序中,必須確保所創建的對象在不再需要它們的時候被銷毀。Cocoa定義了內存管理規則和原則使得正確管理應用程序的內存變得容易和可靠。

關鍵詞:Objective-C;內存管理;應用

中圖分類號:TP311.11

在編寫程序的過程中,有效和高效地管理內存資源是程序開發人員需要著重考慮的事情,一方面是為了保證應用程序的內存消耗盡可能低,另一方面是為了防止內存泄漏。為此,Cocoa定義了一些有助于內存管理的規則和原則。內存管理所要做的就是清理不用的內存,以便內存能夠再次利用,即以某些方式確定一個對象不再需要使用了,并且它占用的內存能夠被回收。

1 Objective-C內存管理規則

Cocoa提供了一種被稱為“引用計數”或“保留計數”的機制,內存管理被放在對象創建與銷毀的生命周期中,該機制不同于C語言中有方法(malloc/free)直接操作內存,也不同于GC語言自動管理內存。實際上,這種內存管理方式使得每一個對象都有一個引用計數,當對象被創建的時候,其引用計數為1;當引用計數減少到0時,對象會被銷毀。

在Objective-C中,所有對象都被定義為指針;指針是一個特殊的變量,它里面存儲的數值被解釋成為內存里的一個地址,如果使用不當,就會出錯或者造成內存的泄露。因此,在進行內存管理時,需要了解內存管理規則。Objective-C內存管理規則的主要內容:(1)把對象視為內存,只能釋放或自動釋放所擁有的對象。(2)當使用含有alloc、new、copy的方法創建對象,便擁有該對象的所有權;或者向對象發送retain消息,也會擁有該對象的所有權。(3)當不再使用對象時,向對象發送release或autorelease消息,將會釋放對象的所有權。通常,在不適合立即回收對象的情況下才使用autorelease。(4)通過實現dealloc方法來釋放所擁有的實例變量。(5)自由釋放池(@autoreleasepool),即自動引用計數(ARC機制),這是一種半自動機制,可以手動設置或取消。自動內存釋放使用@autoreleasepool關鍵字聲明一個代碼塊,當代碼塊執行完之后,對象都會自動調用一次release方法,同時對象的銷毀過程也得到了延遲(統一調用release方法)。

2 常見錯誤及對策

內存泄露主要是指由于設計的失誤對某塊內存失去控制,而這塊內存不能被再次使用,導致了內存的浪費。當發生內存泄露或別的內存問題時會比較麻煩,因為編譯器不會自動發現這類錯誤,通常是在程序運行時才能捕捉到;同時,Objective-C 2.0后引入的ARC機制,也不能完全避免內存泄露等問題。避免內存問題、解決內存泄露的辦法:(1)為了防止內存泄露,當使用alloc或copy創建了對象,或者使用retain保留了對象,我們都必須通過release方法釋放。(2)改寫dealloc方法,在需要的時候釋放內存。(3)手動創建autoreleasepool,該方法使得無須等待系統釋放所創建的對象,便可告訴系統在代碼段結束時釋放對象。(4)大多數情況下,申請內存的語句數量和釋放內存的語句數量應該相等。

3 應用實例

以下是內存管理的一個例子,首先定義了一個類Student,包含兩個實例變量name和age,自定義相應的setter和getter方法,并手動管理內存,該例子給出了一個內存泄露的情況,并在最后給出解決方案。

3.1 Student類的接口文件的定義:

3.2 Student類的實現文件的定義:

3.3 主方法main的實現如下:

從運行結果發現,當對象stu的實例變量name被字符串s2=”Jacky”重新賦值,此時,原來定義的字符串s1不再使用,但是它的引用計數仍然為1,到最后它所占用的內存都沒有被釋放。

導致這種問題的產生的根源在-(void)setName:方法上,當[stu setName:s1]時,name擁有了s1的使用權;接下來,當用戶使用[stu setName:s2]來替換了原來s1的值時,并沒有對name發送release消息,那么name對于s1的使用權就沒有釋放,但此時name的值已被s2所取代,即此刻name擁有了s2的使用權,而s1不再使用,而此時s1的引用計數仍為1,所占用內存沒有正?;厥?,故產生了內存泄露。

為了解決該內存問題,我們在原來的-(void)setName:方法中,增加[name release];這行代碼(即原方法中被注釋掉的一行),該代碼使得原來name沒有正確釋放它所擁有的對象的使用權的問題得到解決,相應的內存管理過程也正確了。同時,需要說明的是,當初次執行[name release];時,name的值為nil,而在Objective-C程序中,向nil發送任何消息都不會報錯。

4 結束語

綜上,只要掌握了Objective-C中的內存管理的正確方法和步驟,很多不必要的內存問題和內存泄露是完全可以避免的。

參考文獻:

[1]楊正洪,鄭齊心,李建國.Objective-C程序設計[M].北京:清華大學出版社,2011.

[2]Stephen G.Kochan著,林冀,范俊,朱奕欣譯.Objective-C程序設計(第4版)[M].北京:電子工業出版社,2012.

[3]Scott Knaster,Waqar Malik,Mark Dalrymple著,周慶成(譯).Objective-C基礎教程(第2版)[M].北京:人民郵電出版社,2013.

作者簡介:任艷(1982.04-),女,教師,講師,碩士研究生,研究方向:現代數據庫技術。

作者單位:蘇州高博軟件技術職業學院,江蘇蘇州 215100

猜你喜歡
應用
多媒體技術在小學語文教學中的應用研究
微課的翻轉課堂在英語教學中的應用研究
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合