引用計數的相關內容數組
✓OC中內存管理機制就是引用計數安全
✓每一個對象都有引用計數,理論上若是對象的引用計數爲0, 它就會自動釋放對象,系統會回收它開闢的內存空間函數
✓在實際的開發中,存在多個指針指向同一個對象spa
2.影響引用計數的一些方法.net
使引用計數加1的方法(alloc,retain,copy,NSString的直接賦值字符串等)指針
retainCount是查看引用計數的次數的一個參考,不絕對.注意:當引用計數被釋放爲0時,retainCount打印出來仍是1,理論上是0orm
release 是釋放的方法,即引用計數減1對象
注意:系統釋放完了以後,理論上是會被銷燬的,而後釋放相應的內存,可是爲了不野指針的現象,因此咱們在後面經常加入置空,即將指針地址nil內存
autorelease也是使引用計數減1,可是他不是當即執行,而是在指向了[pool autorelease]語句以後纔會減1;固然若是用系統的自動釋放池,或者本身創建自動釋放池,在裏面指向了引用計數加的時候,若是沒有釋放,而後會在自動釋放池外,所有統一銷燬開發
若是你想比較安全的使用對象,能夠經過retain這個方法將這個對象持有,增長引用計數;若是不想使用這個對象,也就是銷燬,可使用release,減小它的引用計數
特別強調:管理內存的核心就是使內存保持平衡.內存始終遵循的一大準則就是平衡原則
若是引用計數沒有在保證平衡的原則,則會形成兩個現象:內存泄露,野指針現象.
內存泄露:就是引用計數增長的次數大於減小的次數
注:main函數結束後,p指針只被釋放了一次,能夠理解爲指針已被銷燬,可是對象仍是存在的,只是經過指針沒法找到對應的對象罷了,形成對象沒法釋放
野指針現象:就是引用計數釋放的次數大於增長的次數
如上程序:引用計數加1,可是釋放了兩次,當釋放完以後,及時將指針置空,再次釋放,就能夠有效地避免野指針的現象.
3.autoreleasepool的使用(前提是在MRC環境下使用)
注:若是對象p在自動釋放池的內部調用autorelease,那麼這個自動釋放池就會自動記錄release的信息,若是自動釋放池銷燬了,那麼其中的東西也會被釋放,在自動釋放池中必須遵循平衡原則
4.系統自帶 @autoreleasepool 相關的內容
這一個最主要的就是能夠本身建立一個自動釋放池,也可使用系統自帶的,他最大的特色,就是全部使用的東西都會在池外統一釋放
5.拷貝
拷貝分爲深拷貝和淺拷貝兩種.
6.深拷貝:拷貝的是對象,實際上就是建立一個新的對象
淺拷貝:拷貝的是指針,也就是對象的地址,它們操做的是同一個對象
注:拷貝的一大重點就是須要遵循NSCopying協議
深拷貝和淺拷貝最大的區別就是其實現方法
7.NSString的retainCount
建立字符串的對象,使用常量字符串賦值時,說明對象在常量區
可是當咱們使用initWithFormat時,建立的對象可能有兩種可能:存放在堆區和常量區,若是字符串對象若是在常量區時,你使用了release,並不會對retainCount形成任何影響,可是,必須遵循內存平衡原則,不管在哪一個區,只要引用計數加1以後都必須相應的減1
8.copy和mutableCopy的區別
copy建立的對象是不變的
mutableCopy建立的對象是可變的
以數組爲例
輸出