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,該創建的仍創建,該釋放的仍釋放。
http://www.cnblogs.com/haibosoft/p/3656290.html
文章列表