OC-堆棧、內(nèi)存管理

MRC:手動內(nèi)存管理

ARC:默認是ARC:automatic

Reference Count,自動引用計數(shù)器


Person

*p = [[Person alloc] init];

//p就叫做對象的所有者而晒,默認對象出生時,alloc后阅畴,對象引用計數(shù)器值為1

//當(dāng)我們看到new alloc創(chuàng)建對象時倡怎,引用計數(shù)器值為1.

NSLog(@"%lu",p.retainCount);

//retainCount:能夠輸出對象引用計數(shù)器的值



引用計數(shù)器的操作

想要管理對象占用的內(nèi)存,就要學(xué)會操作引用計數(shù)器贱枣。

引用計數(shù)器的常見操作:

retain消息:使計數(shù)器+1(該方法返回對象本身)

release消息:使計數(shù)器-1(不代表釋放對象)

retainCount:獲得對象當(dāng)前的應(yīng)用計數(shù)器值监署,輸出:%ld,%lu

注意:release不代表銷毀對象纽哥,僅僅是引用計數(shù)器-1.

怎么判斷對象被釋放

dealloc方法:只要調(diào)用了這個方法钠乏,就代表對象即將被釋放。

僵尸對象:已經(jīng)被釋放的對象春塌。

野指針:指向僵尸對象的指針晓避。

空指針:指向nil的指針,給空指針發(fā)送消息(調(diào)用方法)不會報任何錯誤只壳。

但是俏拱,如果沒有一個統(tǒng)一的釋放原則,name就會造成代碼的混亂吕世,會都可以釋放彰触,好比一個公司所有的領(lǐng)導(dǎo)沒有分工一樣,任何事命辖,任何一個領(lǐng)導(dǎo)都可以插一嘴况毅。所以,釋放對象要遵循一個原則尔艇,那就是誰創(chuàng)建尔许,誰釋放。

如果在程序結(jié)束后终娃,對象沒有被釋放味廊,此時稱為內(nèi)存泄漏。

釋放對象時棠耕,若要查看釋放情況余佛,重寫dealloc方法:

- (void)dealloc

{

? ? NSLog(@"%d號房間被釋放啦",_fno);

?? ?//這里必須調(diào)用父類的dealloc

? ? [super dealloc];

}


@property參數(shù)

格式:@property(參數(shù)1,參數(shù)2)數(shù)據(jù)類型 方法名

Setter:改set方法的名字

Getter改get方法的名字

什么是內(nèi)存管理:(面試必問)

管理堆區(qū)內(nèi)存的分配和釋放

分配內(nèi)存:newalloc copy

釋放內(nèi)存:release



@class


@class Cat窍荧;//僅僅告訴編譯器Cat是一個貓類辉巡,可以聲明一個對象。

建議:頭文件引入一個類的時候蕊退,使用@class郊楣。

具體使用:

在.h文件中使用@class引用一個類

在.m文件中使用#import包含這個類的.h文件

引入一個類的方法有兩種

#import和@class

區(qū)別:

#import方式會包含被引用類的所有信息,包括被引用類的變量和方法;@class方式只是告訴編譯器在A.h文件中B

? ? ? *b只是類的聲明瓤荔,具體這個類里有什么信息净蚤,這里不需要知道,等實現(xiàn)文件中真正要用到時输硝,才會真正去查看B類中信息今瀑。

使用@class方式由于只需要知道被引用類(B類)的名稱就可以了,而在實現(xiàn)類由于要用到被引用類中的實體變量和方法点把,所以需要使#import來包含被引用類的頭文件橘荠。

通過上面兩點也很容易知道在編譯效率上,如果有上百個頭文件都#import了同一個文件愉粤,或者這些文件一次被#import(A->B,B->C,C->D.砾医。。)衣厘,一旦最開始的頭文件稍有改動如蚜,后面引用到這個文件的所有類都需要重新編譯一遍,這樣的效率也是可想而知的影暴。而相對來講错邦,使用@class方式就不會出現(xiàn)這種問題了;

所以我們實際開發(fā)中盡量在.h頭文件中使用@class

對于循環(huán)依賴關(guān)系來說型宙,比方A類引用B類撬呢,B類也引用A類

這樣嵌套包含的代碼編譯就會報錯

當(dāng)使用@class在兩個類相互聲明,就不會出現(xiàn)編譯器報錯

面試題:#import和@class的區(qū)別妆兑。

作用上的區(qū)別

import會包含引用類的所有信息(內(nèi)容),包括引用類的變量和方法

? ? ? ? @class僅僅是告訴編譯器有這么一個類,具體這個類里有什么信息,完全不知道魂拦。

效率上的區(qū)別

如果有上百個頭文件都#import了同一個文件,或者這些文件依次被#import,那么一旦最開始的頭文件稍有改動,后面引用到這個文件的所有類都需要重新編譯一遍,編譯效率非常低相對來講,使用@class方式就不會出現(xiàn)這種問題了毛仪。

對于循環(huán)retain的情況,對象不能夠釋放芯勘,此時只能讓一方使用assign箱靴。

@property(nonatomic,assign)Girl? ? ? *girl;



NSString


由于字符串是一個特殊的類,因此OC給NSString的retainCount賦值了一個很大的值荷愕,因此開發(fā)的時候不用考慮NSString的內(nèi)存管理問題衡怀。


自動釋放池(ARC)


int main(int argc, const char* argv[]) {

? ? @autoreleasepool {//自動釋放池

? ? ? ? //autorelease:當(dāng)對象調(diào)用這個方法時,就把對象放到了自動釋放池中

? ? ? ? Person *p = [[[Person alloc]init]autorelease];

? ? ? ? //不用關(guān)注對象什么時候被釋放

? ? }//出了花括號,會對池子里面的所有調(diào)用了autorelease方法的對象,做一次release

? ? return 0;

}


ARC特點總結(jié)

不允許調(diào)用release,retain,retainCount

允許重寫dealloc,但是不允許調(diào)用[super dealloc]

@property的參數(shù)

strong:相當(dāng)于原來的retain(適用于OC對象類型)安疗,成員變量是強指針

weak:相當(dāng)于原來的assign(適用于OC對象類型)抛杨,成員變量是弱指針

assign:適用于非OC對象類型(基礎(chǔ)類型)


ARC使用注意事項


ARC中,只要弱指針指向的對象不在了荐类,就直接把弱指針做清空(賦值為nil)操作

_weak Person *p = [[Person alloc]init];//不合理,對象一創(chuàng)建出來就被釋放掉怖现,對象釋放掉后,ARC把指針設(shè)置為nil

ARC在Property處不在使用retain掉冶,而是使用strong真竖,在dealloc中不需要在[super

? ? dealloc],@property(nonatomic,strong)Dog *dog;//意味著生成的成員變量_dog是一個強指針,相當(dāng)于以前的retain厌小。

如果換成是弱指針恢共,則換成weak,不需要加_.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末璧亚,一起剝皮案震驚了整個濱河市讨韭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌癣蟋,老刑警劉巖透硝,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異疯搅,居然都是意外死亡濒生,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門幔欧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來罪治,“玉大人,你說我怎么就攤上這事礁蔗【跻澹” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵浴井,是天一觀的道長晒骇。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么洪囤? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任徒坡,我火速辦了婚禮,結(jié)果婚禮上箍鼓,老公的妹妹穿的比我還像新娘崭参。我一直安慰自己呵曹,他們只是感情好款咖,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奄喂,像睡著了一般铐殃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上跨新,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天富腊,我揣著相機與錄音,去河邊找鬼域帐。 笑死赘被,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肖揣。 我是一名探鬼主播民假,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼龙优!你這毒婦竟也來了羊异?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤彤断,失蹤者是張志新(化名)和其女友劉穎野舶,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宰衙,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡平道,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了供炼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片一屋。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖劲蜻,靈堂內(nèi)的尸體忽然破棺而出陆淀,到底是詐尸還是另有隱情,我是刑警寧澤先嬉,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布轧苫,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏含懊。R本人自食惡果不足惜身冬,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岔乔。 院中可真熱鬧酥筝,春花似錦、人聲如沸雏门。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茁影。三九已至宙帝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間募闲,已是汗流浹背步脓。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留浩螺,地道東北人靴患。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像要出,于是被迫代替她去往敵國和親鸳君。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

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

  • 內(nèi)存管理的原理厨幻? 內(nèi)存空間總共有8塊區(qū)域相嵌,有兩個區(qū)域需要特別注意,一個就是堆空間况脆,一個就是椃贡觯空間。棧里存放臨時變量...
    Carden閱讀 454評論 0 1
  • iOS內(nèi)存管理 概述 什么是內(nèi)存管理 應(yīng)用程序內(nèi)存管理是在程序運行時分配內(nèi)存(比如創(chuàng)建一個對象,會增加內(nèi)存占用)與...
    蚊香醬閱讀 5,694評論 8 119
  • 29.理解引用計數(shù) Objective-C語言使用引用計數(shù)來管理內(nèi)存格了,也就是說看铆,每個對象都有個可以遞增或遞減的計數(shù)...
    Code_Ninja閱讀 1,470評論 1 3
  • 出門一周弹惦,只有睿睿沒帶作業(yè),說好了回家補做悄但。今天就要兌現(xiàn)了棠隐,做一天作業(yè)確實是對她來說是很痛苦的事,但是玩就是有代價...
    a晟睿閱讀 174評論 0 0
  • 早上還是和往常一樣煞茫,早早起床,送完孩子上學(xué)摄凡,然后再急匆匆的奔向單位续徽。一切看似平常,但又反常架谎。 因為今天是...
    無邊風(fēng)雨閱讀 277評論 1 2