第二章 內(nèi)存管理

2.1 內(nèi)存消耗

  • 2.1.1 棧大小

    1.每個線程都有專用的椬钪眩空間

    2.每個方法都有自己的棧幀抓艳,并消耗整體的棾鄞空間,棧幀會消耗一定字節(jié)的內(nèi)存

    3.復雜頁面會遞歸調(diào)用layoutSubViews和drawRect方法娜饵,如果層級過深,可能會導致棧溢出
  • 2.1.2 堆大小
    1.每個進程的所有線程共享一個堆

    2.一個應用可以使用的堆大小遠遠小于設(shè)備的RAM值

2.2 內(nèi)存管理模型

  • 當一個對象創(chuàng)建于某個方法的內(nèi)部時官辈,那該方法就持有了這個對象
  • 如果這個對象從方法返回箱舞,則調(diào)用者持有該對象

2.3 自動釋放對象

  • 自動釋放對象讓你能放棄對一個對象的持有關(guān)系,但延后對它的銷毀
  • 使用autorelease的引用計數(shù)有如下規(guī)則:

    1.持有的對象是alloc方法返回的

    2.不需要再使用release

    3.使用autorelease表明你想要放棄持有關(guān)系拳亿,同時允許方法的調(diào)用者在對象唄釋放之前使用對象

2.4 autoreleasepool

  • autoreleasepool是允許你放棄對一個對象的持有關(guān)系晴股,但可避免它立即被回收的一個工具
  • 塊中收到過aurolease消息的所有對象都會在autoreleasepool塊結(jié)束時收到release消息。

2.5 自動引用計數(shù)

  • ARC規(guī)則如下:

    1.不能用retain风瘦,release队魏,autorelease,retainCount方法

    2.可以實現(xiàn)dealloc万搔,但是不能調(diào)用

    3.不能在C語言的結(jié)構(gòu)體內(nèi)使用對象指針

    4.id和void *不能自動轉(zhuǎn)換胡桨,需要顯示轉(zhuǎn)換

    5.屬性不能以new開頭

2.6 引用類型

  • 默認的引用類型是強引用
  • 被強引用指向的內(nèi)存不會被釋放
  • 強引用會對引用計數(shù)加1,從而拓展對象的生命周期
  • 弱引用是一種特殊的引用類型瞬雹。它不會增加引用計數(shù)昧谊,因而不會拓展對象的生命周期
  • __weak具有安全性,對象被回收時酗捌,指針將自動被設(shè)置為nil
  • __unsafe_unretained和__weak相似呢诬,但不能在對象被回收時涌哲,自動設(shè)置為nil
  • assign,unsafe_unretained只應該用于值類型

2.8 僵尸對象

  • 僵尸對象用于捕捉內(nèi)存錯誤的調(diào)試功能
  • 通常情況下尚镰,當引用計數(shù)降為0時阀圾,對象會被立即被釋放,使得調(diào)試困難狗唉。如果開啟了僵尸對象初烘,那么對象不會被立即釋放,而是標記為僵尸分俯。
  • 任何訪問僵尸對象的行為都會被記錄肾筐,因此可以排查問題
  • NSZombieEnabled是一個環(huán)境變量,可以控制Core Foundation的運行時是否將使用僵尸對象
  • 不應該長期保留NSZombieEnabled,因為牧人情況下不會有對象唄真正析構(gòu)缸剪,這會導致應用使用大量內(nèi)存吗铐。
  • 發(fā)布前要禁用NSZombieEnabled

2.10 循環(huán)引用

  • 引用計數(shù)的最大陷阱在于不能處理環(huán)狀的引用關(guān)系

2.11 弱類型:id

  • 由于可以把任何消息都發(fā)送給id類型的對象,會出現(xiàn)編譯器不報錯的問題杏节,代碼如下:
@interface Test:NSObject
- (void)test1;
@end

@implementation Test
- (void)test1 {
    NSLog(@"xxxx");
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSArray *ary = @[@"a",@"a",@"a"];
        [ary[1] test1];
    }
    return 0;
}
  • 上述ary[1]得到的為id類型的實例唬渗,且沒有提示沒定義test1函數(shù)等錯誤信息,是因為編譯器會根據(jù)所調(diào)用的方法名稱遍歷查找導入的頭文件以匹配的方法名奋渔,然后通過找到第一個匹配的方法獲取參數(shù)長度
  • 解決方案:

    1.[(NSString*)ary[1] test1]; 顯示調(diào)用谣妻,編譯器會直接在對應類型中查找

    2.開啟編譯器警告"Strict Selector Matching",開啟后在你id類型實例發(fā)送方法時卒稳,若多個類有完全相同的方法簽名(名稱和參數(shù))時會有警告,但開啟后會導致內(nèi)置的框架產(chǎn)生許多警告蹋半,出現(xiàn)一堆不必要警告
  • 在常規(guī)命名中盡量避免使用id類型

2.13 單例

  • 依賴注入:需要時傳遞依賴,將依賴以外界傳入充坑,而不是說在本類進行實例化减江,將實例化的過程外放

2.15 最佳實踐

  • 常用最佳實踐:

    1.避免大量使用單例

    2.不要設(shè)計出萬能類,(盡量職責單一)

    3.對數(shù)值屬性(SEL,CGFloat等)用assign

    4.對block屬性捻爷,使用copy

    5.避免在block中直接使用外部的變量辈灼,@weakify,@strongify

    6.注意銷毀定時器也榄、移除通知巡莹、解除回調(diào)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市甜紫,隨后出現(xiàn)的幾起案子降宅,更是在濱河造成了極大的恐慌,老刑警劉巖囚霸,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腰根,死亡現(xiàn)場離奇詭異,居然都是意外死亡拓型,警方通過查閱死者的電腦和手機额嘿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門瘸恼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人册养,你說我怎么就攤上這事东帅。” “怎么了球拦?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵冰啃,是天一觀的道長。 經(jīng)常有香客問我刘莹,道長,這世上最難降的妖魔是什么焚刚? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任点弯,我火速辦了婚禮,結(jié)果婚禮上矿咕,老公的妹妹穿的比我還像新娘抢肛。我一直安慰自己,他們只是感情好碳柱,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布捡絮。 她就那樣靜靜地躺著,像睡著了一般莲镣。 火紅的嫁衣襯著肌膚如雪福稳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天瑞侮,我揣著相機與錄音的圆,去河邊找鬼。 笑死半火,一個胖子當著我的面吹牛越妈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钮糖,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼梅掠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了店归?” 一聲冷哼從身側(cè)響起阎抒,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎消痛,沒想到半個月后挠蛉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡肄满,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年谴古,在試婚紗的時候發(fā)現(xiàn)自己被綠了质涛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡掰担,死狀恐怖汇陆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情带饱,我是刑警寧澤毡代,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站勺疼,受9級特大地震影響教寂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜执庐,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一酪耕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧轨淌,春花似錦迂烁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至躏结,卻和暖如春却盘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背媳拴。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工谷炸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人禀挫。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓旬陡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親语婴。 傳聞我的和親對象是個殘疾皇子描孟,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

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