iOS內存管理簡介
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:域名注冊、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設、陸川網(wǎng)站維護、網(wǎng)站推廣。Objective-C的內存管理機制與.Net/Java不同,它沒有提供全自動的垃圾回收機制,需要我們進行手動管理,其本質相當于在C語言的基礎上稍微加了一些自動方法。iOS平臺中的內存管理采用了引用計數(shù)的管理機制,當創(chuàng)建一個對象使用alloc或者allocWithZone方法時,引用計數(shù)就會+1;當釋放對象使用release方法時,引用計數(shù)就會-1,這意味著每一個對象都會跟蹤有多少對象引用它,一旦引用計數(shù)為0,該對象的內存就會被釋放掉。另外,iOS還提供了一種延時釋放機制AutoRelease,以這種方式申請的內存,開發(fā)者無需手動釋放,系統(tǒng)會在某一時機釋放該內存。因此,開發(fā)人員在開發(fā)應用的時候必須合理的控制何時創(chuàng)建對象、保存對象以及從內存中釋放對象。如果使用太多的內存,iPhone會警告應用程序委托和UIViewController,委托收到applicationDidReceiveMemoryWarning:回調,視圖控制器會收到didReceiveMemoryWarning,如果繼續(xù)使用太多內存的話,iPhone將終止你的應用程序,使你的用戶回到SpringBoard。很明顯,這不是我們所希望得到的用戶體驗。
iOS內存使用原則:
1. 對象的所有權與銷毀
①誰創(chuàng)建,誰釋放:如果是以alloc,new或者copy創(chuàng)建的對象,則必須調用release或者autorelease方法釋放內存,如果沒有釋放,則導致內存泄漏。除了alloc,new,或copy之外的方法創(chuàng)建的對象都被聲明了autorelease。
②誰retain,誰釋放:如果對一個對象發(fā)送retain消息,其引用計數(shù)會+1,則使用完必須發(fā)送release或autorelease方法釋放內存或恢復引用計數(shù),如果沒有釋放,同樣導致內存泄漏。
③沒創(chuàng)建且沒retain,別釋放:不要釋放那些不是自己alloc或者retain的對象,否則程序會crash,不要釋放autorelease的對象,否則程序會crash。
2. 對象的深拷貝與淺拷貝
①深拷貝:復制指針所引用的數(shù)據(jù),并將其賦給副本的實例變量。其流程是先創(chuàng)建一個
新的對象且引用計數(shù)為1,并用就舊對象的值初始化這個新對象。
ClassA *objA=[[ClassA alloc] init];
ClassA *objB=[objA copy];
objB是一個新對象,引用計數(shù)為1,且objB的數(shù)據(jù)等同于objA的數(shù)據(jù)。
注:objB需要釋放,否則會內存泄漏
②淺拷貝:將原始對象的指針復制到副本中,原始對象和副本共享引用數(shù)據(jù)。其流程是,無需引入新的對象,把原有對象的引用計數(shù)+1即可。
ClassA *objA=[[ClassA alloc] init];
ClassA *objB=[objA retain];
注:objB需要釋放,恢復objA的引用計數(shù),否則會引起內存泄漏。
3. 對象的存取方法
①屬性的聲明與實現(xiàn)
變量聲明的常用屬性類型包括:
readonly屬性:只能讀,不能寫;
assign屬性:是默認屬性,直接賦值,沒有任何保留與釋放問題;
retain屬性:會增加原有對象的引用計數(shù),并且在賦值前會釋放原有對象,然后再進行賦值。
copy屬性:會復制原有對象,并在賦值前釋放原有對象,然后再進行賦值。
②屬性聲明可能帶來的問題:
當一個非指針變量使用retain(或者copy)這個屬性時,盡量不要顯性的release這個變量,直接給這個變量置空即可,否則容易產生過度釋放,導致程序crash。
iOS中autorelease機制
1.一般地,在新建一個iPhone項目的時候,xcode會自動在mian函數(shù)中為你創(chuàng)建一個autorelease pool,其全名是NSAutoreleasePool,是Objective-C中的一個類。
2.在NSAutoreleasePool中包含了一個可變數(shù)組,用來存儲被聲明為autorelease的所有對象,如果一個對象被聲明為autorelease,系統(tǒng)所做的工作就是把這個對象加入到這個數(shù)組中去。
3.當AutoreleasePool自身被銷毀的時候,它會遍歷這個數(shù)組,release數(shù)組中的每一個成員,如果此時數(shù)組中成員的retain count為1,那么release之后,retain count為0,對象正式被銷毀。如果此時數(shù)組中成員的retain count大于1,那么release之后,retain count大于0,此對象依然沒有被銷毀,內存泄漏。
Main函數(shù)如下:
int main(int argc,char *argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
int retVal=UIApplicationMain(argc,argv,nil,nil);
[pool release];
return retVal;
}
4.自動釋放池所涉及到的一些常見問題
在ios程序開發(fā)的時候,會經(jīng)常遇到在滑動列表,頻繁訪問圖片,頻繁打開或關閉數(shù)據(jù)庫的時候,內存會莫名其妙的增長,其實,這些都很有可能是autorelease機制的所導致的。
分析如下:
①滑動列表的時候,內存增長原因:沒有使用UITableVIew的reuse機制,導致每顯示一個cell都用autorelease的方式重新alloc一次,導致cell的內存不斷增加。或者,每個cell會顯示一個單獨的UIView,在UIView發(fā)生內存泄漏,導致cell內存不斷增長。
②頻繁訪問圖片的時候,內存增長原因:頻繁的訪問網(wǎng)絡圖片,導致ios內部API,會不斷的分配autorelease方式的buffer來處理圖片的解碼與顯示。
③頻繁打開和關閉SQLite數(shù)據(jù)庫,內存增長原因:在進行sqlite頻繁打開和關閉操作,而且讀取的數(shù)據(jù)buffer較大,那么sqlite在每次打開關閉的時候,都會利用autorelease的方式分配51k的內存,如果訪問次數(shù)多,內存馬上會頂?shù)綆资?,甚至上百兆,所以,對于頻繁讀寫數(shù)據(jù)庫且數(shù)據(jù)buffer較大的情況,可以設置sqlite長連接方式,避免頻繁打開或關閉數(shù)據(jù)庫。
iOS內存使用誤區(qū)
1.重復釋放:不要釋放不是自己創(chuàng)建的對象,釋放自己或系統(tǒng)的autorelease對象,app都會crash。
2.循環(huán)引用:循環(huán)引用,容易產生野引用,內存無法回收,最終導致內存泄漏??梢酝ㄟ^弱引用的方式打破循環(huán)引用鏈。所謂的弱引用就是不需要retain,直接采取賦值的方式,這樣的話可以避免循環(huán)引用,同時也要注意避免重復釋放的問題。
IOS內存警報處理流程
1. app收到系統(tǒng)發(fā)過來的memory warning的notice;
2. app釋放占用較大的內存;
3. 系統(tǒng)回收此app所創(chuàng)建的autorelease的對象;
4. app返回到已經(jīng)打開的頁面時,系統(tǒng)重新調用viewdidload方法,view重新加載頁面數(shù)據(jù),重新進行顯示;
iOS內存檢查工具
1. 編譯分析工具Analyze
可以發(fā)現(xiàn)編譯中的warning,內存泄漏隱患,甚至是邏輯上的問題,從而避免嚴重的由于內存引起的嚴重的bug。
內存泄漏隱患提示:Potential Leak of an object allocated on line…
數(shù)據(jù)賦值隱患提示:The left operand of…is a garbage value;
對象引用隱患提示:Reference-Counted object is used after it is release;
2. 內存檢測工具
①內存泄漏檢測工具——Leak
②內存猛增檢測工具——Allocations
二者的詳細使用,可以自己查閱相關信息進行了解。
總之,對于IOS中內存的管理,需要我們在實際的程序開發(fā)中通過編寫相應代碼,以及調試相關由內存引起的的問題,才可以得到比較好的體會。如果在開發(fā)過程中,不能按照分配原則進行內存的合理分配與釋放,將會對整個應用程序的性能造成很嚴重的影響,甚至導致其崩潰。所以開發(fā)者必須在深刻理解ios內存管理機制的基礎上,采用最佳的內存管理方式,才能獲得優(yōu)良的用戶體驗。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
網(wǎng)站標題:Objective-C中內存管理-創(chuàng)新互聯(lián)
轉載來源:http://jinyejixie.com/article10/ddeego.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供Google、全網(wǎng)營銷推廣、電子商務、移動網(wǎng)站建設、云服務器、外貿建站
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內容