1.記憶體的建立和釋放
讓我們以Object-c世界中最最簡單的申請記憶體方式展開,談談關於一個物件的生命週期。首先建立一個物件:
1
2
3
|
//“ClassName”是任何你想寫的類名,比如NSString NSArray等一切隨意 id testObject = [[ClassName alloc] init]; 注: alloc 是object-c 中常用來申請記憶體塊的方式 |
此時,對於物件“testObject”來說,他的引用計數就是1了,原因就是他呼叫了alloc來建立了一塊只屬於他的記憶體,這樣物件的引用計數 就得+1. 另外,Object-c中的另兩個關鍵字retain和copy也會將物件的引用計數+1.根據Object-c的記憶體管理機制,我們在使用完 “testObject”後,需要釋放它。
[testObject release];
release後的物件,雖然已經釋放,但是他的指標地址仍然存在,只是指向了一塊已經釋放且無用的記憶體,所以我們建議release後直接賦個nil來置空。
一般,如果我們能知道需要實現功能所涉及的“className”的具體類名,就不建議使用init方法去初始化,比如以下程式碼:
NSString *strTest=[[NSString alloc] initWithString:@"test"]; (推薦)
NSString *strTest=[[NSString alloc] init]; (不推薦)
2.類方法和例項方法
簡單來說,例項方法就是得有了具體例項(物件)後才能使用的方法,一般以減號形式作為方法的字首來宣告,比如API定義
-(id)initWithString:(NSString *)aString;
相比而言,類方法則無需具體物件,只需要類的名稱即可呼叫,一般以加號形式作為方法的字首來宣告,比如API定義:
+(id)stringWithString:(NSString *)aString;
大可以將類方法理解為靜態方法,類方法在物件還沒建立出來之前已經有了。
3.屬性關鍵字
@property (nonatomic, assign) int B;
@property (nonatomic, retain) id classObj;
可以看到關鍵之@property後的括號出現了四個特徵性關鍵字:nonatomic , assign , retain , settet, 這些關鍵字直接告訴編譯器後面的變數用何種方式來存取。
屬性關鍵字 | 使用範圍 | 釋義 | 是否是預設值 | 小貼士 |
assign | 賦值方式 | 不復制不保留,直接賦值 | YES |
基本資料型別和本類不直接擁有的物件 |
retain | 賦值方式 | 將新值保留一份賦覆蓋原值 | NO | 大部分物件可使用 |
copy | 賦值方式 | 將新值複製一份賦覆蓋原值 | NO | 字串選擇性使用 |
readwrite | 讀寫許可權 | 生成getter和setter兩個方法 | YES | 變數可讀取可修改 |
readonly | 讀寫許可權 | 只生成getter方法 | NO | 變數只讀不可修改 |
atomic | 原子性 | 原子操作 | YES | 可以保留在多執行緒環境下,能安全的存取值 |
nonatomic | 原子性 | 非原子操作 | NO | 不生成多執行緒同步內容 |
getter | 存取方法 | 自定義取方法 | NO | |
setter | 存取方法 | 自定義賦值方法 | NO |
關於nonatomic,如果我們能確定不需要多執行緒訪問時,強烈推薦使用這個關鍵字,因為atomic對於效能的損失相對較大
如果是類的delegate,推薦使用assign關鍵字,原因是避免了retain的死迴圈造成的物件無法真正的釋放
3.ARC新增關鍵字
ARC新增兩個武功高強的左右護法:strong 和 weak
strong的含義和retain相同,weak和assign相同,修飾完的屬性變數用法也是完全沒有改變,不過strong和weak只能修飾物件。
蘋果官方對於ARC機制中物件的記憶體引用規則:
(1)任何物件,如果仍有持有者,就不會銷燬
(2)任何物件,已經沒有任何持有者,即自動銷燬
持有者就是指向物件的指標,如果是strong修飾的,即是物件的持有者,如果是weak屬性的,則不是持有者
4.ARC機制的使用規則
對於ARC機制的使用,蘋果釋出了幾條重要的規則需要開發者遵守。單單看那些生搬硬套的東西難免生澀,根據開發經驗將規則總結如下:
(1)不能呼叫dealloc,不能重寫和呼叫retain,release,retainCount 和autorelease,同理,@selector(retain),@selector(release)這些曲線救國的方法也不能呼叫。 dealloc雖然能夠重寫,但是不能呼叫[super dealloc]之類的方法,CoreFoundation框架由於非從屬cocoa框架,所以CFRetain和CFRelease仍然正常使用。
(2)不能使用NSAllocateObjec或NSDeallocateObject函式來建立物件
(3)不能在C語言的結構體中使用物件指標,同時建議用object-c的類來管理資料而不是結構體
(4)不得使用NSAutoreleasePool物件。ARC中,全部使用@autorelease關鍵字代替,且比NSAutoreleasePool更高效
(5)不得使用記憶體Zone,那些牽涉NSZone的方法都不得使用。
(6)不得對一個屬性變數的取值方法命名以new開頭
(7)outlet均用weak關鍵字修飾,除非他是xib中最頂部的介面元素,則需要strong。
(8)Core Foundation不適合ARC,該建立的仍建立,該釋放的仍釋放。
轉載自: