文章出處

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


文章列表


不含病毒。www.avast.com
全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()