P12 iPhone/MacObjective-C內存管理教程和原理剖析初學objectice-C的朋友都有一個困惑,總覺得對objective-C的內存管理機制琢磨不透,程序經常內存泄漏或莫名其妙的崩潰。我在這里總結了自己對objective-C內存管理機制的研究成果和經驗,寫了這么一個由淺入深的教程。希望對大家有所幫助,也歡迎大家一起探討。此文涉及的內存管理是針對于繼承于NSObject的Class。一基本原理Objective-C的內存管理機制與.Net/Java那種全自動的垃圾回收機制是不同的,它本質上還是C語言中的手動管理方式,只不過稍微加了一些自動方法。1Objective-C的對象生成于堆之上,生成之后,需要一個指針來指向它。ClassA*obj1=[[ClassAalloc]init];2Objective-C的對象在使用完成之后不會自動銷毀,需要執行dealloc來釋放空間(銷毀),否則內存泄露。[obj1dealloc];這帶來了一個問題。下面代碼中obj2是否需要調用dealloc?ClassA*obj1=[[ClassAalloc]init];ClassA*obj2=obj1;[obj1hello];//輸出hello[obj1dealloc];[obj2hello];//能夠執行這一行和下一行嗎?[obj2dealloc];不能,因為obj1和obj2只是指針,它們指向同一個對象,[obj1dealloc]已經銷毀這個對象了,不能再調用[obj2hello]和[obj2dealloc]。obj2實際上是個無效指針。如何避免無效指針?請看下一條。3Objective-C采用了引用計數(refcount或者retaincount)。對象的內部保存一個數字,表示被引用的次數。例如,某個對象被兩個指針所指向(引用)那么它的retaincount為2。需要銷毀對象的時候,不直接調用dealloc,而是調用release。release會讓retaincount減1,只有retaincount等于0,系統才會調用dealloc真正銷毀這個對象。ClassA*obj1=[[ClassAalloc]init];//對象生成時,retaincount=1[obj1release];//release使retaincount減1,retaincount=0,dealloc自動被調用,對象被銷毀我們回頭看看剛剛那個無效指針的問題,把dealloc改成release解決了嗎?ClassA*obj1=[[ClassAalloc]init];//retaincount=1ClassA*obj2=obj1;//retaincount=1[obj1hello];//輸出hello[obj1release];//retaincount=0,對象被銷毀[obj2hello];[obj2release];[obj1release]之后,obj2依然是個無效指針。問題依然沒有解決。解決方法見下一條。4Objective-C指針賦值時,retaincount不會自動增加,需要手動retain。ClassA*obj1=[[ClassAalloc]init];//retaincount=1ClassA*obj2=obj1;//retaincount=1[obj2retain];//retaincount=2[obj1hello];//輸出hello[obj1release];//retaincount=2–1=1[obj2hello];//輸出hello[obj2release];//retaincount=0,對象被銷毀問題解決!注意,如果沒有調用[obj2release],這個對象的retaincount始終為1,不會被銷毀,內存泄露。(1-4可以參考附件中的示例程序memman-no-pool.m)這樣的確不會內存泄露,但似乎有點麻煩,有沒有簡單點的方法?見下一條。5Objective-C中引入了autoreleasepool(自動釋放對象池),在遵守一些規則的情況下,可以自動釋放對象。(autoreleasepool依然不是.Net/Java那種全自動的垃圾回收機制)5.1新生成的對象,只要調用autorelease就行了,無需再調用release!ClassA*obj1=[[[ClassAalloc]init]autorelease];//retaincount=1但無需調用release5.2對于存在指針賦值的情況,代碼與前面類似。ClassA*obj1=[[[ClassAalloc]init]autorelease];//retaincount=1ClassA*obj2=obj1;//retaincount=1[obj2retain];//
P27 一、路徑規范1./private/var/mobile新刷完的機器,要在這個文件夾下建一個Documents的目錄,很多程序都要用到。
P19 蘋果應用程序發布流程:如何將應用上傳到AppStore的詳細流程介紹
P32 在深入研究iPhone界面的視圖和控件之前,有必要理解這些元素的操作方式和隱喻含義。本文將介紹應用于大多數程序的視圖,以及它們的屬性和使用方式。
P13 SQLite顧名思議是以 SQL為基礎的數據庫軟件,SQL是一套強大的數據庫語言,主要概念是由「數據庫」、「資料表」(table)、「查詢指令」(queries)等單元組成的「關聯性數據庫」(進一步的概念可參考網絡上各種關于SQL及關聯性數據庫的文件)。因為SQL的查詢功能強大,語法一致而入門容易,因此成為現今主流數據庫的標準語言(微軟、Oracle等大廠的數據庫軟件都提供SQL語法的查詢及操作)。 以下我們就建立數據庫、建立資料表及索引、新增資料、查詢資料、更改資料、移除資料、sqlite3命令列選項等幾個項目做簡單的介紹。
P54 NSStringFromCGRect(someCG) 把CGRect結構轉變為格式化字符串; CGRectFromString(aString) 由字符串恢復出矩形; CGRectInset(aRect) 創建較小或較大的矩形(中心點相同),+較小 -較大 CGRectIntersectsRect(rect1, rect2) 判斷兩矩形是否交叉,是否重疊 CGRectZero 高度和寬度為零的/位于(0,0)的矩形常量
P3 內容概要一、Push機制概括說明二、PUSH機制詳細說明三、PUSH認證階段是難點四、PSUH使用方法?一、Push機制概括說明Provider是指某個iPhone軟件的Push服務器APNS是Apple Push Notification Service(ApplePush服務器)的縮寫,下文統一使用該縮寫。?
P7 類,Object-c中的類和Java中類的概念一樣,需要注意的是一下幾點: Object-c中的類一般在頭文件中生聲明,類是用@interface編譯器指令來進行聲明
P19 iPhone 程式開發簡略筆記
P19 我將新版開發環境在Windows XP下VMWare虛擬機中安裝開發環境過程貼出來,讓大家分享。 本文在Windows Xp + VMware Workstation 7.0 + MAC OS X Snow Leopard 10.6 環境下安裝iPhone SDK 3.1.2成功!
P51 深入理解iPhone OS/SDK與Objective-C2.0。