assign,copy,retain ,weak,strong(二)

如果需要持有一個對象,那麼對其發送retain 如果之後不再使用該對象,那麼需要對其發送release(或者autorealse) 每一次對retain,alloc或者new的調用,需要對應一次release或autorealse調用

什麼時候retain

例如:person是一個類
在vc聲明瞭屬性person1和person2
@property (nonatomic,strong) person *person1;
self.person1 = [[person alloc]init];
//在alloc的時候開闢了一個內存地址  OXOOOOOOea3  來存儲person1這個指針,此時OXOOOOOOea3的引用計數 retainCount = 1,這個1代表有一個指針指向OXOOOOOOea3這塊內存


此時添加一句代碼
self.person2 = self.person1;
//注意了,不是person1的值給person2,而是聲明瞭一個person的類型指針person2 也指向了person1的內存地址
//此時 OXOOOOOOea3的retainCount +1 = 2,代表OXOOOOOOea3這個內存地址有兩個指針在指向這塊內存,這就是引用計數的原理

//換句話說,只要有一個新的指針指向OXOOOOOOea3內存地址,那麼它的引用計數retainCount就+1,

這時候person1使用完了,需要釋放,在mrc的時候需要寫[self.person1 release];
//這時候OXOOOOOOea3的引用計數retainCount-1=1
//現在OXOOOOOOea3還有一個指針指向它,它並不會消失

現在person2也使用完畢了,arc也會幫我們插入一條[person2 release];
//這時候person2這個指針指向的內存OXOOOOOOea3  retainCount-1=0,代表已經沒有指針指向這塊內存地址了
//那麼ok,OXOOOOOOea3內存釋放

什麼是strong

上面講到mrc OXOOOOOOea3內存地址的引用計數,通過retain來增加。

  • 在oc的arc中,strong 又稱爲強引用,換一句貼切點的strong就是指針,strong聲明的都是需要指向某一塊內存地址的指針,說三次,strong是指針,strong是指針,strong是指針。
  • 所以當你聲明的strong對象從內存中創建的時候會插入mrc的retain,來讓你指向的內存地址 引用計數retainCount+1
  • 什麼又是強引用?,只要strong聲明的指針 指向這個內存地址,一直指這它,那麼這個塊內存地址就不會被釋放
  • 除非指向的內存 引用計數retainCount=0或者超出了你聲明指針的作用域,比如你在vc2聲明person2,返回到vc1,那麼vc2會delloc,所有vc2將會從該內存中移除。
    這就是強引用

什麼是weak

舉個例子加深理解,

  • 小明找到了一個很漂亮的女朋友小花
  • 小明和小花是戀人關係,並且小花說了,只愛小明一個只要小明不愛她了,她就跳樓,strong
  • 小軍也喜歡小花,做不成戀人就做閨蜜吧,嗯weak,就只能看看而已
  • 真的有一天小明變心了,愛上了如花,小花傷心欲絕,跳樓而死。從此小軍再也見不到小花了。(小花retainCount-1=0)

//解釋一下,此時小花這個內存只有小明這個strong指針指向,同時能被weak指針看到,當小明不再指向小花,小花此時沒有指針指向它,從內存殺死了,當然小軍weak就再也看不到了

什麼是copy

繼續上面的故事,結局不一樣了

  • 小明strong一直深愛着小花(內存)
  • 官二代小軍copy出現,說了,他一定要得到小花,不惜一切代價。
  • 小明沒辦法,只有讓了,照着小花的真人模樣做了一個硅膠娃娃送給了小軍。
  • 此時小軍….

小花是內存,做的娃娃是另一個內存,容易懂吧

什麼是assign

一樣的故事。。。

  • 小明strong和小花快樂的玩耍着
  • 土匪小軍assign出現 ,說了,他一定要得到小花,不惜一切代價。
  • 這次小軍不喜歡娃娃了,直接擄走了小花,但是小花心裏只裝着一個人就是小明,心中未曾多個人,引用計數retainCount不加1,還是1,小明和小花還是一對戀人
  • 小花茶飯不思,不久GG思密達上天了(retainCount-1=0)
  • 小明從此注孤生置爲nil
  • 小軍已經入了魔,天天還是與小花的空殼在一起,還愛着小花,此時小花已經死去。是該把小軍送進精神病院了(該把它置爲nil了,不然始終是一個指向不存在的地址,使用到的時候要崩潰)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章