如果需要持有一個對象,那麼對其發送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了,不然始終是一個指向不存在的地址,使用到的時候要崩潰)