自動引用計(jì)數(shù)
1.1 什么是自動引用計(jì)數(shù)
內(nèi)存管理中對引用采用自動計(jì)數(shù)的計(jì)數(shù)
1.2 內(nèi)存管理/引用計(jì)數(shù)
這一張舉了一個非常生動的例子,對比著講解了內(nèi)存管理的思考方式的四部分
a. 自己生成的對象,自己持有
我們創(chuàng)建了一個對象锥忿,好比是創(chuàng)建了一個辦公室,然后我們持有這個對象缩举,相當(dāng)于第一個進(jìn)入辦公室的人衣赶,同時打開了里面的燈盛正。
b. 不是我們創(chuàng)建的對象,也可以持有
然后其他的對象引用并持有了我們創(chuàng)建的對象屑埋,就像這個辦公室又陸陸續(xù)續(xù)的又進(jìn)來了幾個同事豪筝。
c. 不需要持有對象時釋放
當(dāng)下班的時候,我們都要離開辦公室摘能,所以我們又都陸陸續(xù)續(xù)的離開辦公室续崖,當(dāng)最后一個人離開這個辦公室的時候,我們關(guān)了燈团搞,相當(dāng)于這個對象廢棄了严望。。逻恐。
d. 不是自己持有的對象無法釋放
這個就更好理解了像吻,假如你不在辦公室峻黍,你怎么才能出去。拨匆。姆涩。
什么是自己創(chuàng)建的對象?
所有通過alloc惭每,new骨饿,copy,mutableCopy方法創(chuàng)建的對象都屬于自己創(chuàng)建的對象台腥。
什么是非自己創(chuàng)建的對象宏赘?
所有不屬于上述四種方法創(chuàng)建的對象。這種對象需要在獲取后持有黎侈,即retain
不再需要持有的對象時釋放察署,即release
不是自己持有的對象無法釋放。
邏輯上容易理解峻汉,但是暫時無法理解如何實(shí)現(xiàn)贴汪。
1.2.3 對象生命周期方法的實(shí)現(xiàn)
這個名字是我自己取得。俱济。嘶是。對象生命周期的方法為alloc钙勃,retain蛛碌,release,dealloc辖源,這一小節(jié)講的是上述四方法在GNUstep源碼中的實(shí)現(xiàn)
大致講一個對象生成時蔚携,內(nèi)存塊頭部為一個結(jié)構(gòu)體,結(jié)構(gòu)體內(nèi)只有一個屬性retained克饶,他的值就是引用計(jì)數(shù)酝蜒,初始值為0
alloc調(diào)用時,分配內(nèi)存塊矾湃,返回的地址為 struct * +1
retain retained ++
retainCount 返回retained + 1
release retained — 亡脑,若此方法調(diào)用時retained為0,則調(diào)用dealloc邀跃,廢棄對象
1.2.4蘋果的實(shí)現(xiàn)
與GNU實(shí)現(xiàn)不同霉咨,我的理解是,蘋果實(shí)現(xiàn)中拍屑,對象生成的同時途戒,會建立一張表,用來儲存引用計(jì)數(shù)和指向的內(nèi)存塊
這里其實(shí)理解不是特別深僵驰,看第二遍的時候再仔細(xì)研究下
蘋果實(shí)現(xiàn)和GNU實(shí)現(xiàn)的對比喷斋。
GNU:1. 少量代碼即可完成唁毒。2. 統(tǒng)一管理引用計(jì)數(shù)用內(nèi)存塊和對象用內(nèi)存塊。
蘋果:1. 對象內(nèi)存塊的分配無需考慮內(nèi)存塊頭部星爪。2. 引用表各記錄中存有內(nèi)存塊地址浆西,可從各個記錄追溯到各個對象的內(nèi)存塊。
這里要說的是第二條在調(diào)試中有著至關(guān)重要的作用移必。即使出現(xiàn)故障導(dǎo)致對象占用的內(nèi)存塊損壞室谚,只要引用技術(shù)表沒有被破壞,就能夠確認(rèn)各內(nèi)存塊的位置崔泵。