內(nèi)存管理

內(nèi)存管理的原理秸抚?

內(nèi)存空間總共有8塊區(qū)域,有兩個區(qū)域需要特別注意歹垫,一個就是堆空間剥汤,一個就是棧空間排惨。棧里存放臨時變量(對象的指針變量吭敢,以及整形和浮點型),堆里存放動態(tài)變量(對象的存放)對象被引用次數(shù)暮芭,引用計數(shù)器鹿驼。在堆的存儲對象里,每個對象內(nèi)部都會分配4個字節(jié)的存儲空間來存儲引用計數(shù)器谴麦。alloc和new都會開辟內(nèi)存空間蠢沿,只要計數(shù)器不為0伸头,就會占用內(nèi)存空間匾效。retain,對象計數(shù)器加1。release恤磷,對象計數(shù)器減1面哼。retainCount返回當前對象引用計數(shù)值野宜。dealloc在對象被銷毀時會被調(diào)用。嚴謹就嚴謹在這兒魔策,時候時候才能算作對象被銷毀呢匈子?就是引用計數(shù)變?yōu)?的時候。這時候dealloc里必須寫的一個方法就是闯袒,給被銷對象里的屬性賦值的如果是一個對象的時候虎敦,那么這時候也需要把這個被銷毀的屬性對象給realease掉。當然這個時候也道出了dealloc的本質(zhì):重寫父類的dealloc,對象被銷毀都會調(diào)用dealloc方法政敢,即對象死之前再說點遺囑其徙,做點事情。既然是重寫父類方法喷户,其實準確地說是增添父類的方法唾那,那就必須調(diào)用【super dealloc】,因為super里面也要做一些回收操作褪尝,否則無法調(diào)用父類里的dealloc方法闹获。而且一定要放在最后面。植物大戰(zhàn)僵尸的子彈內(nèi)存回收就是一個典型的手動內(nèi)存回收機制河哑。

僵尸對象避诽?

所占用內(nèi)存已經(jīng)被回收的對象,人死也不能復(fù)生璃谨,僵尸對象也不能起死回生后再次使用茎用,也就是說對象成為僵尸對象之后,任何消息都不能發(fā)送給這個對象睬罗,即使是retain那也不行轨功。野指針?簡單的說就是指向僵尸對象(不可用內(nèi)存)的指針容达。棧內(nèi)存空間里總會有一個指針變量指向堆內(nèi)存空間里的對象古涧。至于這個對象現(xiàn)在是否還擁有自己的內(nèi)存空間并不影響指針變量去指向它,當操作對象的指針的引用計數(shù)為0時花盐,堆空間的對象內(nèi)存空間已經(jīng)消失羡滑,但是指向?qū)ο蟮木€卻依然存在,也就是說對象的內(nèi)存空間已經(jīng)不存在算芯,指針卻依然存在柒昏,不為空,也就是指針變量依然存儲著指向堆內(nèi)存空間里的對象的那個內(nèi)存地址熙揍,也就是我們通常意義上理解的那一個”箭頭“职祷。去訪問對象的這片這個內(nèi)存空間,自然崩潰!只有將指針變量指向nil有梆,也就是將指針變量指向堆內(nèi)對象的那篇內(nèi)存空間的那個箭頭給注銷掉是尖。也就相當于清除了指針指向?qū)ο髢?nèi)存的那一條線。這樣就不會錯誤了泥耀。OC中不存在空指針錯誤饺汹,給空指針發(fā)送消息,不報錯痰催。retain返回對象本省兜辞。release沒有返回值】淙埽空指針弦疮?沒有指向任何東西的指針(存儲的東西是nil,NULL蜘醋,0)胁塞,給空指針發(fā)送消息不會出錯。

兩個對象之間有關(guān)系的時候压语,就是內(nèi)存管理還是很嚴謹?shù)模?/p>

何處此言啸罢,就是說!先說一下我經(jīng)常出現(xiàn)的一個錯誤胎食,就是當我使用全局變量接收實例化的一個對象的時候扰才,總是不會加retain,當然這個地方有一點不一樣的就是。這里時全局變量厕怜,當然全局變量是寫在.h還是寫在.m里是有區(qū)別的衩匣,前者可以在非本類被使用,所謂使用就是賦值和取值這兩種嘛粥航!后者則主要是為了私有琅捏,只是在本類里使用。MJ視頻主要是想說明递雀?兩個對象之間有聯(lián)系的情況柄延,比如說對象1擁有對象2類型的屬性,那么這中間的內(nèi)存管理該如何去管理缀程,當然肯定在實例化對象1和實例化對象2的時候就一定會使得各自的引用計數(shù)變?yōu)?.那么問題來了搜吧,如果我給對象1的屬性通過set方法賦值。

set方法賦值的輸入?yún)?shù)到底是什么杨凑?

其實輸入?yún)?shù)到底是什么不最終還是取決于全局變量屬性時聲明屬性變量的那個類嘛滤奈!既然現(xiàn)在聲明屬性變量的類時是那個對象2的類,那自然就是將通過對象2的類實例化的對象2作為輸入?yún)?shù)作為對象1的set方法的輸入?yún)?shù)嘛撩满!現(xiàn)在的問題就是蜒程,現(xiàn)在總共有兩個指針指向?qū)ο?绅你,但是引用計數(shù)任然為1,也就是說搞糕,當我們注銷對象2時,對象2立馬消失曼追,這樣有一個指針卻仍然指向這片內(nèi)存空間窍仰,但是內(nèi)存空間已經(jīng)被釋放不存在了,這樣那個通過set輸入?yún)?shù)建立引用的指針就是我們常說的野指針礼殊。這個野指針指向的那個內(nèi)存空間已經(jīng)被釋放的對象自然也就是僵尸對象了驹吮!

問題關(guān)鍵如何保證對象在有指針指向它的時候不會被銷毀呢?

解決方案就是只要有一個引用晶伦,或者說只要有一個指針指向這個對象碟狞,那么就讓這個對象的引用計數(shù)加1?。這里需要注意最根本的一點就是不僅僅是只有alloc和new才會創(chuàng)建指針變量指向?qū)ο蠡榕悖鋵崒ο笸ㄟ^set方法賦值給另一個對象的屬性時也會在棧內(nèi)存空間生成一個指針變量族沃。只是我不明白的是,這個指針變量是什么呢泌参?毫無疑問脆淹,當然就是對象1建立屬性的時候創(chuàng)建的那個屬性變量名了!現(xiàn)在知道為什么創(chuàng)建對象屬性的時候需要添加號沽一,而創(chuàng)建整型屬性變量的時候不用添加號了吧盖溺!其實準確的解釋也不是太懂,但是至少整型這類屬性變量是存儲在占空間铣缠,如果屬性變量名表示指針烘嘱,而單獨不要的,前面加_下劃線的屬性變量名就是代表了真正的屬性蝗蛙,那么我想說的就是整型類型的屬性不需要指針蝇庭,因為它們是存儲在棧空間捡硅,只有存儲在堆空間的對象才需要指針專門記錄對象在堆空間中的具體位置遗契,并將地址列表存儲在棧內(nèi)存空間里,也即是說病曾,只有對象類型的屬性變量牍蜂,存儲在堆內(nèi)存空間的變量才需要添加號用來記錄對象在堆內(nèi)存空間的地址。既然是將對象2賦值給一個帶的屬性變量泰涂,自然就相當于指針指向了對象2鲫竞。既然是有一個指針指向了對象2,那么必須要做的一件事情就是將對象2的引用計數(shù)加1逼蒙。于是就使用到了retain了从绘,現(xiàn)在又回歸一個經(jīng)常出現(xiàn)的問題就是,我總是忘記當把實例化的對象賦值給全局變量的指針的時候需要retain了吧?邏輯就是:1僵井、創(chuàng)建的全局變量就是一個帶號的對象2陕截、把一個實例化的對象賦值給帶*號的全局變量的時候自然就相當于創(chuàng)建了一個指針指向了對象。3批什、既然是引用农曲,自然就需要采用retain將引用計數(shù)加1。那么現(xiàn)在就是一個問題了驻债,如何在對象1被注銷的時候乳规,自然對象1里面的指針屬性也會消失,但是在指針屬性消失前一定要做的一件事情就是要做一個負責任的指針合呐,就是在指針消失之前暮的,通過指針里面存儲的位置找到對象的內(nèi)存空間,如何釋放掉這個內(nèi)存呢淌实?當然是通過下劃線_屬性變量名稱調(diào)用realease方法將指針指向的對象的引用計數(shù)減一冻辩,也就是去掉那一個箭頭符號。當然還有一種我未曾遇到過的問題就是拆祈,當我已經(jīng)實例化了一個對象2并通過set方法賦值給了對象1的指針屬性變量微猖,而且現(xiàn)在對象2的引用計數(shù)變成了2,可是我如果再實例化一個對象2并且也是通過set方法將對象2賦值給對象1的屬性缘屹!那么內(nèi)存管理有回出現(xiàn)一個問題凛剥,什么問題自己去發(fā)現(xiàn),不過解決方案就是在set賦值方法里首先調(diào)用釋放一次當前指針所值對象的引用計數(shù)再進行賦值增加引用計數(shù)轻姿!這里的方法使用的前提就是犁珠,必須先判斷通過set方法的輸入?yún)?shù)傳輸進來的對象2是否不同于正在使用的對象2。只有判斷兩個對象2不同互亮,才進行舊對象release犁享,新對象的retain方法。

我后面說的情況其實是非常常見的一種情況豹休,就是當一個對象引用另一個對象的時候炊昆,自然是通過對象1的屬性類型是對象2的形式,通過set方法賦值的時候威根,當然僅僅是更改屬性里的值時那么簡單就好了凤巨,也就是,先對比一下基礎(chǔ)類型變量洛搀,就是如果對象1的屬性是一個基礎(chǔ)類型變量敢茁,第一次直接通過set方法給基礎(chǔ)類型變量的數(shù)據(jù)直接進行復(fù)制,如果我現(xiàn)在需要更改基礎(chǔ)類型數(shù)據(jù)屬性的值只需要重新調(diào)用set方法即可賦值更改成功留美。第一次的基礎(chǔ)類型變臉存儲的數(shù)據(jù)自動被第二次重新賦值給基礎(chǔ)類型數(shù)據(jù)的值所覆蓋彰檬。但是伸刃,要知道,基礎(chǔ)類型數(shù)據(jù)可不同于對象類型數(shù)據(jù)逢倍,前者是存儲在棧內(nèi)存空間捧颅,而后者是存儲在堆內(nèi)存空間。兩者是有區(qū)別的较雕,前者的set方法就是一個純粹的簡簡單單的set方法賦值罷了碉哑!而后者也就是對象屬性在更改屬性值得時候,如何才能考慮到內(nèi)存管理相關(guān)的問題呢郎笆?首先我們知道基礎(chǔ)類型屬性存儲數(shù)據(jù)是不需要開辟內(nèi)存空間的谭梗,而對象類型的數(shù)據(jù)是不僅需要在堆內(nèi)存空間里開辟空間忘晤,更需要在棧內(nèi)存空間里存儲對象類型的內(nèi)存的路徑的指針數(shù)據(jù)宛蚓。而且這不是關(guān)鍵,關(guān)鍵在于為了管理對象屬性的內(nèi)存空間的釋放的問題设塔,就引入了引用計數(shù)這個概念凄吏。所以再覆蓋掉原來的值的時候是必須保持引用計數(shù)不會發(fā)生改變。那如何才能實現(xiàn)這一點了闰蛔,只有在set方法里進行判斷痕钢,新傳入的對象屬性值是否與已經(jīng)存在的對象屬性值一樣,如果一樣序六,自然不進入if判斷任连,就相當于set方法不會被執(zhí)行,反正被執(zhí)行了效果也是一樣的例诀。更常見的情況就是新傳入的對象屬性值與已經(jīng)存在的對象屬性值不一樣随抠。那么自然需要進入if判斷里面的方法,這里面有一句與基礎(chǔ)類型數(shù)據(jù)相同的一句話就是給對象屬性重新賦值的一句話繁涂。但是與基礎(chǔ)類型數(shù)據(jù)賦值不同的就是對象類型數(shù)據(jù)每一次賦值的同時都需要增加被賦值對象的引用計數(shù)拱她,你可能回說,這樣豈不是造成被賦值的對象的引用計數(shù)不斷累加扔罪,最終銷毀不了秉沼,所有為了防止這種錯誤,最必須的一個方法就是每一次再覆蓋對象屬性已經(jīng)存在的值之前都必須考慮到矿酵,就的對象類型數(shù)據(jù)的值得引用計數(shù)的減一唬复,只有先通過減一再通過加一自然才會保證對象被引用一次時引用計數(shù)只會加一。蘋果認為這樣寫很麻煩呀全肮!每對一個類的對象開辟一個全局變量屬性盅抚,要想做好內(nèi)存管理都必須寫好set方法和dealloc方法。而且我們上文已經(jīng)提到過每一個對象從被創(chuàng)建到最終被銷毀的時候倔矾,創(chuàng)建時要注意set方法妄均,而當對象快要被銷毀的時候則又需要格外注意dealloc方法柱锹。只要調(diào)用了alloc,必須有release或autorelease丰包。

屬性為什么要加修飾符禁熏,不加修飾符會發(fā)生什么樣的情況?

就是蘋果認為每創(chuàng)建一個全局變量都需要考慮set方法和get方法邑彪。為什么不考慮一下封裝呢瞧毙?給全局變量的創(chuàng)建封裝成一個方法,通過傳入一些參數(shù)就自動生成不同類型的get方法和set方法寄症。創(chuàng)建全局變量的高級封裝方法就出來了宙彪。就是屬性!

屬性自動幫我們生成get方法和set方法有巧。但是set方法里面有判斷释漆,默認的屬性生成的get和set方法是很笨的。就是最簡單的那種純粹賦值的set方法篮迎!通過給創(chuàng)建的屬性一些修或者說一些參數(shù)就可字自動生成我們想要的set方法和get方法男图。需要注意的是:不能又寫屬性又寫set方法和get方法。否則會報錯甜橱。當我們什么都不寫的時候逊笆,默認就是assign也就是生成最常見的哪一種set和get方法。這種方法就是當我們創(chuàng)建的全局變量是基礎(chǔ)類型數(shù)據(jù)不需要開辟內(nèi)存岂傲,自然更不需要考慮通過使用引用計數(shù)來釋放內(nèi)存的時候难裆,使用默認的屬性就行又或者使用assign就行。當我們需要創(chuàng)建對象屬性的set方法和get方法的時候镊掖,難就難在對象類型全局變量需要在堆內(nèi)存空間動態(tài)開辟內(nèi)存乃戈,因此需要引用計數(shù)這個概念來管理對象類型的內(nèi)存應(yīng)該合適被釋放。所以set方法里必須有一個計數(shù)器加減的過程堰乔,前面有介紹偏化,那么如何通過限制修飾屬性來創(chuàng)建這樣的set方法呢?自然是通過retain來進行修飾镐侯。如果給屬性加上retain修飾法侦讨,就會生成帶判斷的set方法。也就是說現(xiàn)在set方法里有retain方法苟翻。相當于會釋放掉就對象韵卤,重新將新對象賦值給屬性對象指針,且保持引用計數(shù)不變崇猫。但是依然要記得在dealloc方法里面寫上被釋放對象里相關(guān)的對象沈条,要負責任嘛!retain的本質(zhì)就是release舊值 retain新值诅炉,主要適用于OC對象類型蜡歹。assign本質(zhì)就是純粹的set方法直接賦值屋厘,而且你會發(fā)現(xiàn)如果屬性什么修飾符也不寫,默認的set方法就是直接賦值月而,可以看出assign就是賦值的意思汗洒,根本對于那種基本數(shù)據(jù)類型只是需要set方法單純賦值的功能的來說根本就是可寫可不寫嘛!主要使用于非OC對象類型父款。copy 的本質(zhì)就是release舊值溢谤,copy新值。其實我一直不明白的就是憨攒,為什么我在自動內(nèi)存管理情況下建立數(shù)據(jù)模型的時候世杀,必須使用copy而不是retain來修飾OC對象類型呢?

除了可以通過修飾屬性來決定生成哪一種set方法以外肝集,還可以通過readonly ——同時生成setter和getter的聲明和實現(xiàn)瞻坝。readwrite——只會生成getter的聲明、實現(xiàn)包晰。本質(zhì)就是是否要生成get方法湿镀。只讀表示外界只可以讀取到對象的數(shù)據(jù)炕吸,表示對象只會生成get方法而已伐憾!多線程:nonatomic——性能高,不寫這個修飾會影響性能赫模,必須寫树肃。atomic——性能低(缺式⑹肌)宦赠,默認的就是這個。

循環(huán)引用?

類與類之間的關(guān)系寄锐,即你引用我斩祭,我引用你劣像。我包含你,你包含我摧玫。對象用retain,基礎(chǔ)數(shù)據(jù)類型用assign.類1包含類2的頭文件耳奕,類2包含類1的頭文件。這樣會錯诬像,所以不能使用#import(意味著把類里面的所有方法都導(dǎo)過去),應(yīng)該使用@class(僅僅告訴編譯器屋群,某個名稱是一個類名)。使用@class可以辦到#import不能辦到的循環(huán)引用坏挠!解決方案就是芍躏,一個類用retain,另一個類使用assign。A對象retain了B對象降狠,B對象retainA對象对竣。這樣會導(dǎo)致A對象和B對象永遠無法釋放庇楞!當兩端互相引用時,應(yīng)該一段使用retain否纬,另一端使用assign姐刁。而且使用@class個類可以極大地提高編譯器的效率,假設(shè)100個類的.h文件都使用#import方法來引用了類1烦味,那么帶來的問題就是只要類1稍微改變一點聂使,這100個類都會重新編譯,當使用@class則可以完美避免這個問題谬俄,完美提升編譯效率柏靶。ARC中的循環(huán)引用問題?兩個類之間溃论,你strong我屎蜓,我strong你。(人養(yǎng)了條狗钥勋,狗的主人有個人)解決方案就是一個strong,一個用weak.兩端weak和兩端strong都不行炬转,前者就是可能成員變量還在,對象卻消失了算灸,后者則是無法銷毀對象扼劈。所以weak一般就用在這種場合。

autorelease ?

本質(zhì)半自動釋放菲驴,本質(zhì)延遲對象被銷毀時的時間荐吵,當寫完autorelease不會馬上執(zhí)行對象的release方法,只是表示將對象扔到自動釋放池中赊瞬,必須等到自動釋放池被銷毀時先煎,當初寫的autorelease才會生效。

不用擔心對象被release的代碼與其他代碼的順序巧涧,也即是不用擔心對象什么時候會被釋放薯蝎,適用于占用內(nèi)存比較小得對象。但是缺點不夠精確谤绳,比如游戲的子彈必須在超出屏幕之后進行內(nèi)存釋放占锯。

開啟僵尸對象,release沒有返回值闷供,autorelease是有類型為id 的返回值的烟央,因此可以在初始化的時候進行連著寫。只要對象調(diào)用了這個方法歪脏,就會把對象扔到了自動釋放池疑俭!當自動對象池被銷毀時,會對池子里的面的所有對象做一次release操作婿失,記住僅僅是release操作哈钞艇!不一定代表自動釋放池被銷毀的時候啄寡,里面的的對象就一定會被銷毀!

為了避免多次使用autorelease方法哩照,因此可以將所有創(chuàng)建對象的過程完完整整的放進自動釋放池里挺物。@autoreleasepool{};的中括號里面就寫創(chuàng)建對象的過程。在@autoreleasepool{};括號里開辟對象的時候再使用autorelease方法時并不會使得對象的引用計數(shù)器發(fā)生改變飘弧。改變引用計數(shù)只能使用retain或alloc识藤。@autoreleasepool{}是存儲在棧內(nèi)存空間里

用法:

1、會將對象放到一個自動釋放池中

2次伶、當自動釋放池被銷毀時痴昧,會對池子里面的所有對象做一次release操作

3、會返回對象本身

4冠王、調(diào)用完autorelease方法后赶撰,對象的計數(shù)器不變

好處:

1、不用再關(guān)心對象釋放的時間

2柱彻、不用關(guān)心什么時候調(diào)用release

注意:

1豪娜、占用內(nèi)存較大的對象不要隨便autorelease,因為要等到很久才會釋放對象的內(nèi)存哟楷,很占內(nèi)存空間的瘤载。而且一旦使用自動釋放池就不能精確控制對象釋放時間

自動釋放池:

1、在iOS程序運行過程中吓蘑,會創(chuàng)建無數(shù)個池子惕虑,這些池子都是以棧結(jié)構(gòu)存在

2坟冲、當一個對象調(diào)用autorelease方法時磨镶,會將這個對象放到棧頂?shù)尼尫懦兀ㄒ簿褪前ㄋ膶ο蟪兀?/p>

dealloc是系統(tǒng)自動調(diào)用的。

非OC類型對象:(int健提,float,enum,struct)

特別注意OC對象里的所有全局變量都會有類名號琳猫。不要以為id是個例外,要知道id本身就包含一個號私痹。

只要有retain就必須dealloc方法里調(diào)用release.編譯器特性脐嫂,插入那個地方需要插入realease代碼。ARC自動內(nèi)存管理禁止調(diào)用realease方法紊遵。

ARC原理就是通過編譯器自動判斷再說么地方應(yīng)該插入對象的release方法账千。也即是說本質(zhì)就是:ARC就在適當?shù)牡胤讲迦雛elease或atorelease。而且必須強調(diào)一點就是暗膜,指針變量用來操作對象匀奏,假設(shè)指針變臉是P,那么P代表了指針變量里的內(nèi)容学搜,也就是對象存儲在堆內(nèi)存空間里的地址娃善。_p代表了成員變量论衍,可問題在于,成員變量_p到底與指針變量p是什么區(qū)別呀聚磺?我當然知道一個有 號坯台,另一個沒有號。通過操作指針變量就可以對指針所指向的對象進行操作瘫寝,通過調(diào)用成員變量就可以進行set賦值和get取值操作蜒蕾。而且突然發(fā)現(xiàn)好像在控制器里實例化的對象和在成員變量或?qū)傩宰兞啃揎椫畢^(qū)別,前者直接指向了一個具體的對象焕阿。而后者只能算作是某一類型OC對象的成員變量滥搭,那么問題來了,操作控制器里實例化的對象的時候捣鲸,通常來說是通過直接調(diào)用指針變量來操作所指向的對象瑟匆,包括在MRC里改變引用計數(shù)。以及使用指針變量調(diào)用這個對象所具有的成員變量或?qū)傩栽曰獭3蓡T變量和屬性差別還挺大呢愁溜?在MRC里,要想通過指針變量操作成員變量外厂,還必須通過已經(jīng)聲明和實現(xiàn)的set方法和get方法冕象。自從有了屬性之后,才又出現(xiàn)了self的點語法汁蝶。那么屬性和最初的成員變量的差別在哪兒呢渐扮?確實成員變量加上set方法和get方法等于屬性。所以前者只能通過_p調(diào)用set和get方法才能進行復(fù)制或取值掖棉∧孤桑可是問題就在為什么必須在成員變量名前加一個下劃線呢?難道是為了區(qū)分這表這個對象屬于對象引用的屬性變量而不是控制器創(chuàng)建的對象么幔亥?而且屬性也是同樣的道理耻讽。加上下劃線和使用self的點語法都是可以的。我能理解就是既然是成員變量自然需要與控制器里面創(chuàng)建的對象進行區(qū)分∨撩蓿現(xiàn)在弄清楚了指針變量(p)针肥,成員變量(_p),和指針(p)∠惆椋現(xiàn)在就可以進一步闡述ARC了慰枕。在ARC中,允許重寫dealloc,但是不允許調(diào)用[super dealloc]方法即纲。在ARC中需要引入兩個概念就是:強指針——盡管不是我自己創(chuàng)建的對象具帮,也可以進行強引用,MRC中使用retain,ARC中使用strong。弱指針——弱指針不能決定對象是否被釋放匕坯。而且弱指針指向的對象的不存在時束昵,系統(tǒng)會自動清空弱指針。怎么寫都是對的葛峻,不不會發(fā)生野指針錯誤锹雏。如果對象一開始就是一個弱指針(__weak),那么就會造成對象一創(chuàng)建出來就會被銷毀术奖。因為沒有強指針(__strong)指向?qū)ο蠼缸瘛V灰獩]有強指針(默認情況下所有的指針都是強指針)執(zhí)行對象,就會釋放對象采记,當main函數(shù)執(zhí)行完成之后或者當我們手動將指針變量滯空會后佣耐,指針變量也會被清空銷毀,因此這時候的強指針就會消失唧龄。自然編譯器就會自動在指針變量消失之后加上release方法兼砖。用ARC之后就怎么寫都是對的。

ARC與MRC的區(qū)別或好處在于既棺?

ARC中除了retain改成strong,其它一切不變讽挟。而且整個工程從直接像便魔術(shù)般將MRC改成ARC(Edit——Refactor——Convert to Objective-C ARC)。ARC的好處就在于再也不用關(guān)心什么時候使用realease.而且無論怎么寫都不會錯丸冕。ARC里面如果一個對象要強引用另外一個對象耽梅,不使用retain,而是用strong ,原因就在于:strong代表強引用胖烛,只要強指針還指著創(chuàng)建的OC對象類型屬性眼姐。就意味著我們的成員變量是一個強指針。也就是意味著我這個成員變量(下劃線指針變量名)在佩番,你這個對象就在逝钥。只需記住將以前的retain換成strong就行沃琅。當成員變量使用強指針,自然使得成員變量指向的對象是一個強指針年碘,這樣即使當初創(chuàng)建被指向?qū)ο蟮闹羔槺粶眨簿褪钦f消失一個強指針依然不會造成對象的銷毀,因為另一個對象里的成員變量依然創(chuàng)建了一個強指針指向這個對象,就是剛才那句話疯兼,只要我這個成員變量還在,你那個對象就消失不了。這就是strong的作用,試想過去,我們使用retain就表示我們對被指向?qū)ο笞鲆淮蝦etain操作,就以為著我們擁有那個對象啦!對象都被銷毀了递瑰,對象的成員變量當然不可能存在啦慎颗!成員變量都不在了哗总,自然通過成員變量創(chuàng)建的指向另一個對象的強指針也不會存在啦!強指針都不存在啦倍试,自然當初被指向的對象也不會存在啦讯屈!注意一點:當使用strong或weak修飾屬性的時候,是不需要在strong或weak前面添加雙下劃線_的县习。

在ARC中什么時候使用strong涮母,又什么時候使用weak,又什么時候使用assign來修飾屬性呢?

strong 和weak都智能修飾OC對象類型的屬性躁愿。前者主要為成員變量創(chuàng)建一個強指針叛本,而后者則為成員變量創(chuàng)建了一個弱指針,弱指針對于避免循環(huán)引用非常實用彤钟。對于非OC對象類型的成員變量的修飾與當初MRC一致来候,使用assign進行修飾。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逸雹,一起剝皮案震驚了整個濱河市营搅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌梆砸,老刑警劉巖转质,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異帖世,居然都是意外死亡休蟹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門日矫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赂弓,“玉大人,你說我怎么就攤上這事搬男〖鹫梗” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵缔逛,是天一觀的道長。 經(jīng)常有香客問我,道長褐奴,這世上最難降的妖魔是什么按脚? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮敦冬,結(jié)果婚禮上辅搬,老公的妹妹穿的比我還像新娘。我一直安慰自己脖旱,他們只是感情好堪遂,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著萌庆,像睡著了一般溶褪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上践险,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天猿妈,我揣著相機與錄音,去河邊找鬼巍虫。 笑死彭则,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的占遥。 我是一名探鬼主播俯抖,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瓦胎!你這毒婦竟也來了芬萍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤凛捏,失蹤者是張志新(化名)和其女友劉穎担忧,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坯癣,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡瓶盛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了示罗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惩猫。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蚜点,靈堂內(nèi)的尸體忽然破棺而出轧房,到底是詐尸還是另有隱情,我是刑警寧澤绍绘,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布奶镶,位于F島的核電站迟赃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏厂镇。R本人自食惡果不足惜纤壁,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捺信。 院中可真熱鬧酌媒,春花似錦、人聲如沸迄靠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掌挚。三九已至雨席,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疫诽,已是汗流浹背舅世。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奇徒,地道東北人雏亚。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像摩钙,于是被迫代替她去往敵國和親罢低。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

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

  • 內(nèi)存管理是程序在運行時分配內(nèi)存胖笛、使用內(nèi)存网持,并在程序完成時釋放內(nèi)存的過程。在Objective-C中长踊,也被看作是在眾...
    蹲瓜閱讀 3,077評論 1 8
  • 內(nèi)存管理 簡述OC中內(nèi)存管理機制功舀。與retain配對使用的方法是dealloc還是release,為什么身弊?需要與a...
    丶逐漸閱讀 1,964評論 1 16
  • 內(nèi)存管理的基本范圍和概念. 程序運行過程中藥創(chuàng)建大量的對象, 和其他高級語言類似,在ObjC中對象存儲在堆區(qū),程序...
    ValienZh閱讀 890評論 0 2
  • 29.理解引用計數(shù) Objective-C語言使用引用計數(shù)來管理內(nèi)存辟汰,也就是說,每個對象都有個可以遞增或遞減的計數(shù)...
    Code_Ninja閱讀 1,490評論 1 3
  • 更多精彩內(nèi)容阱佛,點擊關(guān)注↑簡書號帖汞! 羊卓雍措轉(zhuǎn)湖線路 吉久村--廣嘎村--東達村--雜日村--張達鄉(xiāng)--工布學鄉(xiāng)--...
    跟著大賀走川藏閱讀 713評論 0 0