retain、strong、weak、assign区别
生活随笔
收集整理的這篇文章主要介紹了
retain、strong、weak、assign区别
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1. 假設(shè)你用malloc分配了一塊內(nèi)存,并且把它的地址賦值給了指針a,后來(lái)你希望指針b也共享這塊內(nèi)存,于是你又把a(bǔ)賦值給(assign)了b。此時(shí)a 和b指向同一塊內(nèi)存,請(qǐng)問(wèn)當(dāng)a不再需要這塊內(nèi)存,能否直接釋放它?答案是否定的,因?yàn)閍并不知道b是否還在使用這塊內(nèi)存,如果a釋放了,那么b在使用這塊內(nèi)存的時(shí)候會(huì)引起程序crash掉。 2. 了解到1中assign的問(wèn)題,那么如何解決?最簡(jiǎn)單的一個(gè)方法就是使用引用計(jì)數(shù)(reference counting),還是上面的那個(gè)例子,我們給那塊內(nèi)存設(shè)一個(gè)引用計(jì)數(shù),當(dāng)內(nèi)存被分配并且賦值給a時(shí),引用計(jì)數(shù)是1。當(dāng)把a(bǔ)賦值給b時(shí)引用計(jì)數(shù)增加到 2。這時(shí)如果a不再使用這塊內(nèi)存,它只需要把引用計(jì)數(shù)減1,表明自己不再擁有這塊內(nèi)存。b不再使用這塊內(nèi)存時(shí)也把引用計(jì)數(shù)減1。當(dāng)引用計(jì)數(shù)變?yōu)?的時(shí)候,代表該內(nèi)存不再被任何指針?biāo)?#xff0c;系統(tǒng)可以把它直接釋放掉。 3. 上面兩點(diǎn)其實(shí)就是assign和retain的區(qū)別,assign就是直接賦值,從而可能引起1中的問(wèn)題,當(dāng)數(shù)據(jù)為int, float等原生類(lèi)型時(shí),可以使用assign。retain就如2中所述,使用了引用計(jì)數(shù),retain引起引用計(jì)數(shù)加1, release引起引用計(jì)數(shù)減1,當(dāng)引用計(jì)數(shù)為0時(shí),dealloc函數(shù)被調(diào)用,內(nèi)存被回收。 4. copy是在你不希望a和b共享一塊內(nèi)存時(shí)會(huì)使用到。a和b各自有自己的內(nèi)存。
1.assign:?用于非指針變量。用于基礎(chǔ)數(shù)據(jù)類(lèi)型?(例如NSInteger)和C數(shù)據(jù)類(lèi)型(int,?float,?double,?char)另外還有id
?反正記住:前面不需要加?“*”?的就用assign吧,weak?就是相當(dāng)于assign ? 2.?retian?:釋放舊的對(duì)象,將舊對(duì)象的值賦予輸入對(duì)象,再提高輸入對(duì)象的索引計(jì)數(shù)為1,用于指針變量。就是說(shuō)你定義了一個(gè)變量,然后這個(gè)變量在程序的運(yùn)行過(guò)程中會(huì)被更改,并且影響到其他方法。xcode4.3及以后版本上面開(kāi)發(fā),retian和strong都是一樣的,沒(méi)區(qū)別 3.?copy?: ?效果其實(shí)和retain沒(méi)什么兩樣,唯一的區(qū)別就是copy只用于NSString而不能用于NSMutableString,如果當(dāng)一個(gè)類(lèi)繼承NSObject,那么這個(gè)類(lèi)里面的屬性需要使用copy。 retain是指針拷貝,copy是內(nèi)容拷貝。轉(zhuǎn)載于:https://www.cnblogs.com/lihaibo-Leao/p/5242909.html
總結(jié)
以上是生活随笔為你收集整理的retain、strong、weak、assign区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 图片MD5修改工具
- 下一篇: 推荐一款好用的telnet工具