OC 內存管理

  1. 引用計數的相關內容數組

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建立的對象是可變的

以數組爲例

輸出

相關文章
相關標籤/搜索