OC的內(nèi)存管理機制

1.內(nèi)存的創(chuàng)建和釋放
讓我們以O(shè)bject-c世界中最最簡單的申請內(nèi)存方式展開羹奉,談?wù)勱P(guān)于一個對象的生命周期酥泛。首先創(chuàng)建一個對象:

id testObject = [[ClassName alloc] init];

注: alloc 是object-c 中常用來申請內(nèi)存塊的方式

//“ClassName”是任何你想寫的類名蛆挫,比如NSString NSArray等一切隨意

id
testObject = [[ClassName alloc] init];

注: alloc 是object-c 中常用來申請內(nèi)存塊的方式

此時,對于對象“testObject”來說区赵,他的引用計數(shù)就是1了,原因就是他調(diào)用了alloc來創(chuàng)建了一塊只屬于他的內(nèi)存挖滤,這樣對象的引用計數(shù) 就得+1. 另外,Object-c中的另兩個關(guān)鍵字retain和copy也會將對象的引用計數(shù)+1.根據(jù)Object-c的內(nèi)存管理機制浅役,我們在使用完 “testObject”后斩松,需要釋放它。
[testObject release];

release后的對象觉既,雖然已經(jīng)釋放惧盹,但是他的指針地址仍然存在,只是指向了一塊已經(jīng)釋放且無用的內(nèi)存瞪讼,所以我們建議release后直接賦個nil來置空钧椰。
一般,如果我們能知道需要實現(xiàn)功能所涉及的“className”的具體類名尝艘,就不建議使用init方法去初始化演侯,比如以下代碼:
NSString *strTest=[[NSString alloc] initWithString:@"test"]; (推薦)NSString *strTest=[[NSString alloc] init]; (不推薦)

2.類方法和實例方法
簡單來說,實例方法就是得有了具體實例(對象)后才能使用的方法背亥,一般以減號形式作為方法的前綴來聲明秒际,比如API定義
-(id)initWithString:(NSString *)aString;

相比而言,類方法則無需具體對象狡汉,只需要類的名稱即可調(diào)用娄徊,一般以加號形式作為方法的前綴來聲明,比如API定義:
+(id)stringWithString:(NSString *)aString;

大可以將類方法理解為靜態(tài)方法盾戴,類方法在對象還沒創(chuàng)建出來之前已經(jīng)有了寄锐。
3.屬性關(guān)鍵字
@property (nonatomic, assign) int B;@property (nonatomic, retain) id classObj;

可以看到關(guān)鍵之@property后的括號出現(xiàn)了四個特征性關(guān)鍵字:nonatomic , assign , retain , settet, 這些關(guān)鍵字直接告訴編譯器后面的變量用何種方式來存取。
屬性關(guān)鍵字
使用范圍

小貼士

assign
賦值方式
不復(fù)制不保留尖啡,直接賦值
是否是默認(rèn)值 YES
基本數(shù)據(jù)類型和本類不直接擁有的對象

retain
賦值方式
將新值保留一份賦覆蓋原值
是否是默認(rèn)值 NO
大部分對象可使用

copy
賦值方式
將新值復(fù)制一份賦覆蓋原值
是否是默認(rèn)值 NO
字符串選擇性使用

readwrite
讀寫權(quán)限
生成getter和setter兩個方法
是否是默認(rèn)值 YES
變量可讀取可修改

readonly
讀寫權(quán)限
只生成getter方法
是否是默認(rèn)值 NO
變量只讀不可修改

atomic
原子性
原子操作
YES
可以保留在多線程環(huán)境下橄仆,能安全的存取值

nonatomic
原子性
非原子操作
是否是默認(rèn)值 NO
不生成多線程同步內(nèi)容

getter
存取方法
自定義取方法
是否是默認(rèn)值 NO

setter
存取方法
自定義賦值方法
NO

關(guān)于nonatomic,如果我們能確定不需要多線程訪問時,強烈推薦使用這個關(guān)鍵字衅斩,因為atomic對于性能的損失相對較大
如果是類的delegate盆顾,推薦使用assign關(guān)鍵字,原因是避免了retain的死循環(huán)造成的對象無法真正的釋放
3.ARC新增關(guān)鍵字
ARC新增兩個武功高強的左右護法:strong 和 weak
strong的含義和retain相同畏梆,weak和assign相同您宪,修飾完的屬性變量用法也是完全沒有改變,不過strong和weak只能修飾對象奠涌。

蘋果官方對于ARC機制中對象的內(nèi)存引用規(guī)則:
(1)任何對象宪巨,如果仍有持有者,就不會銷毀
(2)任何對象溜畅,已經(jīng)沒有任何持有者捏卓,即自動銷毀
持有者就是指向?qū)ο蟮闹羔槪绻莝trong修飾的慈格,即是對象的持有者天吓,如果是weak屬性的贿肩,則不是持有者
4.ARC機制的使用規(guī)則
對于ARC機制的使用,蘋果發(fā)布了幾條重要的規(guī)則需要開發(fā)者遵守龄寞。單單看那些生搬硬套的東西難免生澀汰规,根據(jù)開發(fā)經(jīng)驗將規(guī)則總結(jié)如下:
(1)不能調(diào)用dealloc,不能重寫和調(diào)用retain,release物邑,retainCount 和autorelease溜哮,同理,@selector(retain),@selector(release)這些曲線救國的方法也不能調(diào)用色解。 dealloc雖然能夠重寫茂嗓,但是不能調(diào)用[super dealloc]之類的方法,CoreFoundation框架由于非從屬cocoa框架,所以CFRetain和CFRelease仍然正常使用科阎。
(2)不能使用NSAllocateObjec或NSDeallocateObject函數(shù)來創(chuàng)建對象
(3)不能在C語言的結(jié)構(gòu)體中使用對象指針述吸,同時建議用object-c的類來管理數(shù)據(jù)而不是結(jié)構(gòu)體
(4)不得使用NSAutoreleasePool對象。ARC中锣笨,全部使用@autorelease關(guān)鍵字代替蝌矛,且比NSAutoreleasePool更高效
(5)不得使用內(nèi)存Zone,那些牽涉NSZone的方法都不得使用。
(6)不得對一個屬性變量的取值方法命名以new開頭
(7)outlet均用weak關(guān)鍵字修飾错英,除非他是xib中最頂部的界面元素入撒,則需要strong。
(8)Core Foundation不適合ARC椭岩,該創(chuàng)建的仍創(chuàng)建茅逮,該釋放的仍釋放。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末判哥,一起剝皮案震驚了整個濱河市献雅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌塌计,老刑警劉巖挺身,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異夺荒,居然都是意外死亡瞒渠,警方通過查閱死者的電腦和手機良蒸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門技扼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嫩痰,你說我怎么就攤上這事剿吻。” “怎么了串纺?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵丽旅,是天一觀的道長椰棘。 經(jīng)常有香客問我,道長榄笙,這世上最難降的妖魔是什么邪狞? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮茅撞,結(jié)果婚禮上帆卓,老公的妹妹穿的比我還像新娘。我一直安慰自己米丘,他們只是感情好剑令,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拄查,像睡著了一般吁津。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上堕扶,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天碍脏,我揣著相機與錄音,去河邊找鬼挣柬。 笑死潮酒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的邪蛔。 我是一名探鬼主播急黎,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼侧到!你這毒婦竟也來了勃教?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤匠抗,失蹤者是張志新(化名)和其女友劉穎故源,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汞贸,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡绳军,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了矢腻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片门驾。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖多柑,靈堂內(nèi)的尸體忽然破棺而出奶是,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布聂沙,位于F島的核電站秆麸,受9級特大地震影響鲜戒,放射性物質(zhì)發(fā)生泄漏马靠。R本人自食惡果不足惜潜秋,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一方妖、第九天 我趴在偏房一處隱蔽的房頂上張望咳焚。 院中可真熱鬧碧囊,春花似錦咖楣、人聲如沸瑟匆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至芍殖,卻和暖如春豪嗽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背豌骏。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工龟梦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窃躲。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓计贰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蒂窒。 傳聞我的和親對象是個殘疾皇子躁倒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 導(dǎo)讀 一、為什么要進行內(nèi)存管理 二洒琢、內(nèi)存管理機制 三秧秉、內(nèi)存管理原則 四、MRC手動內(nèi)存管理 五衰抑、ARC自動內(nèi)存管理...
    千山小畻閱讀 2,050評論 0 7
  • OC采用了引用計數(shù)(retain count)對對象內(nèi)存進行管理,例如,某個對象alloc了,那么這個對象的...
    輕云_閱讀 612評論 0 4
  • 內(nèi)存管理 簡述OC中內(nèi)存管理機制象迎。與retain配對使用的方法是dealloc還是release,為什么呛踊?需要與a...
    丶逐漸閱讀 1,965評論 1 16
  • 1. 為什么要使用內(nèi)存管理 iOS應(yīng)用程序出現(xiàn)crash(閃退), 90%以上的原因是出現(xiàn)了內(nèi)存問題!內(nèi)存問題主要...
    李小六_閱讀 1,866評論 0 2
  • 內(nèi)存管理是程序在運行時分配內(nèi)存砾淌、使用內(nèi)存,并在程序完成時釋放內(nèi)存的過程谭网。在Objective-C中汪厨,也被看作是在眾...
    蹲瓜閱讀 3,080評論 1 8