OC之內(nèi)存管理

導(dǎo)語:

Objective-C 和 Swift 語言的內(nèi)存管理方式都是基于引用計數(shù)的腹备,引用計數(shù)是一個簡單而有效的管理對象生命周期的方式谭贪。引用計數(shù)分為手動引用計數(shù)ARC:和自動引用計數(shù)MRC,現(xiàn)在開發(fā)基本上都會選擇ARC令花。下面簡單介紹下內(nèi)存管理的一些知識阻桅。

1.為什么要進行內(nèi)存管理?

1.應(yīng)用程序的內(nèi)存管理是一個在程序運行時進行內(nèi)存分配兼都,程序結(jié)束時釋放內(nèi)存的過程嫂沉,書寫良好的程序,會盡可能少占用內(nèi)存扮碧。
2.移動設(shè)備的內(nèi)存是有限的趟章,每個程序都會分配一定的內(nèi)存,如果程序超出內(nèi)存限額慎王,程序?qū)罎ⅰ?br> 3.我們必須確保在需要的時候分配內(nèi)存蚓土,在不使用的時候回收內(nèi)存。

2.內(nèi)存管理概述

1.在OC中赖淤,所有的對象都在堆區(qū)分配空間蜀漆,OC采用引用計數(shù)的方法管理對象的生命周期,由程序猿負責(zé)釋放對象所占用的內(nèi)存咱旱。


F769685AE7F52BEDC59C3B434C522405.png

2.OC里有3種內(nèi)存管理機制:


3079C500-B156-41C7-BCCD-4CC9CE32E67B.png

3.對象的所有權(quán)

OC的內(nèi)存管理模型嗜愈,是基于對象的“所有權(quán)”。

所有權(quán)的管理規(guī)則:

(1)當(dāng)你使用alloc莽龟,new,copy锨天,mutableCopy等方法創(chuàng)建對象毯盈,你擁有對象的所有權(quán);
(2)你可以用retain來實現(xiàn)對一個對象的所有病袄;
(3)你不再需要一個對象時搂赋,你必須放棄對對象的持有(release)赘阀;

4.引用計數(shù)

所有權(quán)策略是通過引用計數(shù)來實現(xiàn)的,通常稱之為“retain count”脑奠,每個對象都有一個“retain count”;

(1)當(dāng)創(chuàng)建(alloc, new, copy, mutablecopy)一個對象時基公,它的引用計數(shù)為1;
(2)發(fā)送retain消息給一個對象時宋欺,它的引用計數(shù)加1轰豆;
(3)發(fā)送release消息給一個對象時,它的引用計數(shù)減1齿诞;
(4)autorelease:如果對象不能立刻釋放酸休,可以向?qū)ο蟀l(fā)送autorelease消息,使對象的引用計數(shù)在未來的某個時候減1祷杈,并且在那個時候放棄對象的所有權(quán)斑司;
(5)如果對象的引用計數(shù)是0,系統(tǒng)會向?qū)ο蟀l(fā)送dealloc消息但汞,然后釋放對象的內(nèi)存宿刮;

5.內(nèi)存管理相關(guān)方法

(1)對象引用計數(shù)加1,返回對象本身

- (id)retain;

(2)對象引用計數(shù)減1

- (id)release;

(3)不改變引用計數(shù)私蕾,返回對象當(dāng)前的引用計數(shù)的值

- (unsigned)retainCount;

(4)這個方法在對象引用計數(shù)為0的情況下僵缺,當(dāng)內(nèi)存回收的時候系統(tǒng)自動調(diào)用

- (void)dealloc;

6.自動釋放池

自動釋放池(Autorelease pool)的機制,為你提供了一個“延時”釋放對象的機制是目。當(dāng)你既想放棄對象所有權(quán)谤饭,又不想發(fā)生立即放棄行為,這時候懊纳,你可以向?qū)ο蟀l(fā)送一個autorelease消息揉抵,將對象加入到自動釋放池。

(1)自動釋放池的寫法
4.3以后

@aytoreleasepool{

}

4.3以前

NSAutoreleasePool *pool =[ [NSAutoreleasePool alloc]init];
……
[pool drain];

(2)當(dāng)你向?qū)ο蟀l(fā)送autorelease消息時嗤疯,你已經(jīng)失去了對象的所有權(quán)冤今,所以你不用負責(zé)釋放對象;
(3)自動釋放池獲得了對象的所有權(quán)茂缚,當(dāng)池子釋放時戏罢,會自動向池子里的每一個對象發(fā)送release消息

7.引用計數(shù)和存取器

***setter正確寫法***    
正確寫法1
- (void)setName:(NSString *)aName
{
      [aName retain];
      [name release];
      name = aName;
}
正確寫法2
- (void)setName:(NSString *)aName
{
      if(name != aName) {
      [name release];
      name = [aName retain];
}
正確寫法3 不推薦
- (void)setName:(NSString *)aName
{
      [aName autorelease];
      name = aName;
}

8.引用計數(shù)和字符串

(1)NSString字符串的內(nèi)存管理和普通對象不同;
(2)常量符串在文字常量區(qū)脚囊,沒有引用計數(shù)龟糕;
(3)NNString方法在創(chuàng)建的對象不一定有引用計數(shù),關(guān)鍵卡對象是否在堆區(qū)分配內(nèi)存悔耘;
(4)NSMutableString產(chǎn)生的對象都在堆區(qū)讲岁,都有引用計數(shù)于樟;

9.引用計數(shù)和集合

(1)如果一個對象被放到了集合(Array吗冤,Dictionary攒庵, Set)中芳撒,集合會取得對該對象的所有權(quán),對象的引用計數(shù)會加1阶淘;
(2)從集合刪除對象時衙吩,對象引用計數(shù)減1;
(3)當(dāng)集合自己release的時候溪窒,集合會放棄對該對象的所有權(quán),集合里的所,有對象引用計數(shù)減1霉猛;

10.自動引用計數(shù)---ARC(Automatic Reference Counting)

Xcode 4.2之后引入了自動引用計數(shù)尺锚,ARC是一個編譯期的計數(shù),ARC在編譯期為每個對象添加合適的retain, release惜浅。

ARC規(guī)則
1.禁止任何形式的調(diào)用和實現(xiàn):dealloc瘫辩,retain,release坛悉,retainCount伐厌,autorelease。dealloc可以實現(xiàn)但禁止調(diào)用[super dealloc];
2.不可以使用NSAllocateObject或者NSDeallocateObject裸影,使用alloc申請一塊內(nèi)存后挣轨,其他的都可以交給運行期的自動管理;
3.不能在C語言中的結(jié)構(gòu)體使用OC中的類的指針轩猩;
4.不能使用NSAutoreleasePool卷扮,作為替代,@autoreleasepool被引入均践;
5.禁止以new開頭的屬性變量命名晤锹。

1. 創(chuàng)建完工程后,決定是否使用ARC
BAA00CD2-C484-4691-B1E2-0ED165CBB4F1.png
2. 對工程里的單個文件不使用ARC:在targets的build phases選項下compile Sources下選擇不使用ARC編譯的文件彤委,雙擊它鞭铆,輸入-fno-objc-arc。
3. 強引用和弱引用使用ARC后焦影,OC中的對象指針车遂,可以分為強引用(strong reference)和弱引用(weak reference)

<1>強引用指針?biāo)赶虻膶ο螅瑫詣颖3衷搶ο髍etain;
<2>弱引用指針?biāo)笇ο笏钩剑粫詣颖3衷搶ο蟛暗#绻笇ο筢尫牛撝羔樧詣又脼閚il彬呻;
<3>如果一個對象沒有任何強引用指針指向衣陶,會自動釋放回梧;
<4>默認指針是強引用的

4.ARC下屬性設(shè)置
DB007CAB-F822-4E37-A270-E421EF759CD6.png

weak:delegate和outlet使用;
assign:一般值類型變量用該屬性聲明祖搓,比如:int, bool湖苞,或者省略不寫
retain:該屬性與strong一致拯欧,用于對象,只是可讀性更強一些
strong:用于對象
copy:一般用于字符串
只讀屬性
下面的變量聲明在ARC將會出錯
@property (nonatomic, readonly)NSString *name;
應(yīng)該寫為
@property (nonatomic, strong, readonly)NSString *name;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末财骨,一起剝皮案震驚了整個濱河市镐作,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隆箩,老刑警劉巖该贾,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異捌臊,居然都是意外死亡杨蛋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門理澎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逞力,“玉大人,你說我怎么就攤上這事糠爬】苡” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵执隧,是天一觀的道長揩抡。 經(jīng)常有香客問我,道長镀琉,這世上最難降的妖魔是什么峦嗤? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮滚粟,結(jié)果婚禮上寻仗,老公的妹妹穿的比我還像新娘。我一直安慰自己凡壤,他們只是感情好署尤,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著亚侠,像睡著了一般曹体。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上硝烂,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天箕别,我揣著相機與錄音,去河邊找鬼。 笑死串稀,一個胖子當(dāng)著我的面吹牛除抛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播母截,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼到忽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了清寇?” 一聲冷哼從身側(cè)響起喘漏,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎华烟,沒想到半個月后翩迈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡盔夜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年负饲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片比吭。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡绽族,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出衩藤,到底是詐尸還是另有隱情吧慢,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布赏表,位于F島的核電站检诗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瓢剿。R本人自食惡果不足惜逢慌,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望间狂。 院中可真熱鬧攻泼,春花似錦、人聲如沸鉴象。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纺弊。三九已至牛欢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間淆游,已是汗流浹背傍睹。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工隔盛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拾稳。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓吮炕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親访得。 傳聞我的和親對象是個殘疾皇子来屠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348