1.假設你用malloc分配了一塊內存,並且把它的地址賦值給了a,後來你希望指針b也共享這塊內存,於是你有把a賦值給(assign)了b。此時a和b指向同一內存,請問當a不在需求這塊內存時,能否釋放這塊內存?答案能否定的,由於a並不知道b能否在運用這塊內存,假如a釋放了,那麼b在運用這塊內存的時分就會惹起順序解體
2.理解到1中assign的問題,那麼如何處理呢?最復雜的辦法就是運用援用計數,還是下面的那個例子,我們給那塊內存設一個援用計數,當內存被分配並且賦值給a時,援用計數是1。當把a賦值給b時援用計數添加到2。這時假如a不運用這塊內存,它只需求把援用計數減1,標明自己不在擁有這塊內存。b不再運用這塊內存時也把援用計數減1.當援用計數變為0的時分,代表該內存不在被任何指針所援用,零碎可以把塔直接釋放掉。
3.assign就是直接賦值,從而惹起1的問題,當數據為int float等原聲類型時,可以運用assign。對根底數據類型(nSInteger,CGFloat)和c數據類型(int,float,double,char等)
4.etain就如2中所述,運用了援用計數,retain惹起援用計數加1,release惹起援用計數減1,當援用計數為0時,dealloc函數被調用,內存被回收。retain是創立了一個指針,援用對象技術加1
5.copy是內容拷貝創立了一個新的對象,copy是在你不希望a和b共享一塊內存時會用到。a和b有各自的內存,與舊有的對象援用計數有關,copy增加對象對上下文的依賴。復制內容(深復制),假如調用copy的是數組,則為指針復制(淺復制),僅僅復制子元素的指針。對NSString、block、數組這品種型
6.strong類似於retain,默許狀況下,一個指針都會運用_strong屬性,標明這是一個強援用只需援用存在,對象就不能銷毀
7.weak取代之前的assign,對象銷毀之後會自動置為nil,避免野指針,沒有strong對象指向weak對象,weak對象就是清算這個weak屬性,即便有其他的weak指針指向他,這些weak指針也會被清掉
8.autorelease原理;
1>.先樹立一個autorelease pool
2>.對象從這個autorelease pool外面生成
3>.對象生成=之後調用autorelease函數,這個函數的作用僅僅是在autorelease pool中做個標志,讓pool記得未來release這個對象
4>.順序完畢時,pool自身也需求release,此時pool會把每一個標志為autorelease的對象release一遍。假如某個對象此時retain count大於1,這個對象還是沒有被銷毀
【retain,copy,assign和autorelease】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!