国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

OC-5.內存管理

2019-11-14 18:02:54
字體:
來源:轉載
供稿:網友

一、引用計數器

1> 棧和堆

  1. ① 主要存儲局部變量② 內存自動回收

     

  2. ① 主要存儲需要動態分配內存的變量② 需要手動回收內存,是OC內存管理的對象

     

2> 簡介

  1. 作用

    ① 表示對象被引用的次數② 通常由alloc、new、copy與release方法引發③ 動態監測引用計數器的值,當值為0時回收對象所占的內存

     

  2. 使用注意

    ① 引用計數器一個NSUInteger類型的變量,占用4字節內存② 在對象被創建的時候引用計數器的值被初始化為1③ 每個使引用計數器加1的操作,都有一個引用計數器減1的操作與之  對應

     

3> 基本概念

  1. 僵尸對象

    ① 所占用的內存已經被回收的對象② 僵尸對象不能再被使用

     

  2. 野指針

    ① 指向僵尸對象的指針② OC中引用野指針會報錯,錯誤信息:EXC_DAB_access

     

  3. 空指針

    ① 沒有指向任何內存地址的指針② 空指針的值通常為nil、NULL或0③ 通常在創建指針時將其初始化,避免其指向不確定的內存④ 在對象被銷毀后,通常要將指向對象的指針賦值為nil,避免產生野  指針

     

4> 基本方法

  1. retain

    ① 使引用計數器加1② alloc、new、copy等方法會自動調用retain方法③ 每個retain方法都必須對應一個release方法④ 返回值為對象本身

     

  2. release

    ① 使引用計數器減1② 沒有返回值③ 用空指針調用release方法不會報錯④ 不是經過alloc方法創建的對象,不需要執行release操作

     

  3. dealloc

    ① 在對象被銷毀時調用② 通常需要重寫dealloc方法③ 重寫dealloc方法時,必須在最后調用父類的dealloc方法④ @PRoperty不會影響dealloc方法,只會影響色圖特人和getter

     

二、多對象內存管理

1> 基本使用

  • 當擁有某個對象時,就對該對象執行retain操作
  • 當拋棄某個對象時,就對該對象執行release操作
  • 誰執行retain操作,誰就執行release操作

2> set方法的內存管理

  1. 基本使用

    ① 當set方法的參數是OC對象時,通常要在set方法內實現內存管理② 當參數與成員變量不一樣時,才對成員變量執行release操作,對  參數執行retain

     

  2. set方法的代碼規范

    ① 基本數據類型:直接賦值② OC對象類型    1)先判斷是不是新對象    2)若是,對就對象執行一次release操作,對新對象執行一次retain      操作    3)否則,不執行操作

     

  3. dealloc方法的代碼規范

    ① 對self擁有的所有對象執行一次release操作② 一定要調用父類的dealloc方法,且放在最后③ 在ARC環境下重寫dealloc方法不能調用父類的dealloc方法

     

3> @property對內存的影響

  1. 基本使用

    ① 為成員變量生成setter和getter② 默認生成的setter執行的是直接賦值,不涉及內從管理③ 若setter的參數是OC對象,需要設置@property的參數,使其生成  內存管理代碼

     

  2. @property的參數

    ① 內存管理相關參數    1)retain:release舊對象,retain新對象(適用于OC對象類型)    2)assign:直接賦值(默認,適用于非OC對象)    3)copy:release舊對象,copy新對象② 控制成員變量屬性的參數    1)readwrite:同時生成setter和getter的聲明、實現    2readonly:只會生成getter的聲明、實現③ 多線程管理相關參數    1)nonatomic:生成setter方法時不加線程管理代碼,性能高      (一般用這個)    2)atomic:生成setter方法時加上線程管理代碼,性能低(默認)④ 指定setter和getter名稱的參數    1)通過setter指定生成的set方法的名稱,通過getter指定生成的      get方法的名稱    2)不影響點語法的使用,點語法在使用時先轉換為對應的set或get      方法    3)通常當get方法的返回值為BOOL類型數據時,對get方法使用,      set方法幾乎不用

     

4> 循環包含與循環引用

  1. 循環包含

    ① 但兩個類的聲明文件循環包含時,通常要在一個文件中用@class  聲明另一個類② 使用規范    1)在.h文件中用@class聲明類    2)在.m文件中用#import包含類的聲明文件

     

  2. 循環引用

    ① 當兩個OC類循環引用時,會產生內存管理問題② 解決方法    1)在一個類的聲明中,指定@property的內存管理參數為retain    2)在另一個類的生命中,指定@property的內存管理參數為release

     

三、autorelease

1> 基本使用

  1. 作用

    ① 將調用該方法的對象放進自動釋放池,當池子銷毀時,對池子內所有  的對象執行一次release操作② 通常在對象創建時調用,放回對象本身

     

  2. 自動釋放池的創建方式

    ① 通過@autoreleasepool{}創建② 通過NSAutoreleasePool類創建

     

2> 使用注意

  • 自動釋放池的創建和釋放遵循棧規則
  • 調用autorelease方法不會對引用計數器產生影響
  • autorelease方法延遲了對象的釋放時間,占用內存較大的對象不要使用
  • 一個對象不能多次調用autorelease方法
  • 一個對象不能同時使用autorelease方法和release方法

3> 常見應用

  • 快速創建一個自動釋放池內的對象

    ① 通常設計一個類方法,快速創建一個自動釋放池內的對象② 方法名通常以類名開頭③ 創建時要使用self調用alloc、init與autorelease方法,不要使用類名

     

四、ARC

1> 基本使用

  1. 強指針與弱指針

    ① 強指針	1)通過__strong聲明的指針	2)所有的指針默認都是強指針② 弱指針	1)通過__weak聲明的指針	2)當弱指針指向的對象被釋放,弱指針將被清空
  2. 判斷準則

    只要沒有強指針指向對象,對象就會被釋放

2> @property的strong和weak參數

  • strong參數相當于retain參數
  • weak參數相當于assign參數

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 山东省| 大悟县| 内江市| 大余县| 独山县| 崇文区| 蓝山县| 游戏| 浑源县| 白河县| 康保县| 郎溪县| 巴东县| 柘城县| 苍梧县| 清新县| 兰州市| 凤凰县| 秦安县| 高州市| 文安县| 杂多县| 宁城县| 龙川县| 澜沧| 平度市| 建宁县| 南召县| 拜泉县| 来安县| 襄城县| 梨树县| 南康市| 周口市| 辛集市| 汶川县| 临夏县| 邵东县| 安康市| 哈巴河县| 柏乡县|