亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

OC語言-05-OC語言-內存管理

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

一、引用計數器

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的聲明、實現	2)readonly:只會生成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參數

3> 循環引用的解決方法


五、示例(多文件)

/* 1.創建一個Person類和一個Dog類,Person類與Dog類是相互用有關系 2.重寫Person類與Dog類的dealloc方法 3.重寫Person類的set方法,實現內存管理代碼 4.自定義Person類構造方法,用于快速創建一個自動釋放池內的Person對象 */  /*****main.m文件******/#import <Foundation/Foundation.h>//包含Person類的聲明文件#import "Person.h"//包含Dog類的聲明文件#import "Dog.h"int main(){    //創建自動釋放池    @autoreleasepool {                //創建Dog對象,并加入到自動釋放池中        Dog *d = [[[Dog alloc] init] autorelease];        /*通過調用類方法快速創建一個Person類型的自動釋放池對象        并用Dog初始化新創建的對象的成員變量*/        Person *p = [Person personWithDog:d];                //將指針清空        p = nil;            }    return 0;}/*****Person.h文件******/#import <Foundation/Foundation.h>//聲明Dog是一個類,Dog.h文件用#import指令@class Dog;@interface Person : NSObject/*通過@property生成dog屬性的getter和setter 并使用參數retain,Dog.h使用assign參數*/@property (nonatomic, retain) Dog *dog;/*自定義方法,快速創建一個Person類型的自動釋放池對象,并用Dog初始化新創建的對象的成員變量*/+ (Person *)personWithDog:(Dog *)dog;@end/*****Person.m文件******/#import "Person.h"//使用@class聲明的類,在實現文件中要用#import指令包含該類的頭文件#import "Dog.h"@implementation Person+ (id)personWithDog:(Dog *)dog{    Person *p = [[[Person alloc] init] autorelease];    //將dog賦值給新創建對象的成員變量    p.dog = dog;    return p;}//重寫dealloc方法- (void)dealloc{    NSLog(@"Person對象被釋放");    //釋放person所擁有的屬性    [_dog release];    //調用父類的dealloc方法    [super dealloc];}@end/*****Dog.h文件******/#import <Foundation/Foundation.h>//包含Person.h頭文件,Person.h文件用@class指令#import "Person.h"@interface Dog : NSObject/*通過@property生成person屬性的getter和setter 并使用參數retain,Person.h使用retain參數*/@property (nonatomic, assign) Person *person;@end/*****Dog.m文件******/#import "Dog.h"@implementation Dog//重寫dealloc方法- (void)dealloc{    NSLog(@"Dog對象被釋放");    //釋放Dog所擁有的屬性    [_person release];    //調用父類的dealloc方法    [super dealloc];}@end

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本一区二区不卡| 国内精品国产三级国产在线专| 国产黑人绿帽在线第一区| 日韩欧美成人免费视频| 久久亚洲私人国产精品va| 欧美色欧美亚洲高清在线视频| 国产精品第三页| 亚洲人成伊人成综合网久久久| 国产一区红桃视频| 日韩激情av在线免费观看| 日韩欧美精品网址| 国产香蕉一区二区三区在线视频| 亚洲性猛交xxxxwww| 亚洲精品少妇网址| 国产做受高潮69| 国产精品美女www| www.日韩不卡电影av| 欧美日韩成人精品| 久久国产精品视频| 国产成人精品在线视频| 91美女片黄在线观| 欧美日韩国产中文精品字幕自在自线| 国产91ⅴ在线精品免费观看| 成人免费看吃奶视频网站| 欧美怡春院一区二区三区| 国内伊人久久久久久网站视频| 亚洲人成伊人成综合网久久久| 欧美第一淫aaasss性| 日韩激情片免费| 欧美性jizz18性欧美| 欧美性xxxxxx| 欧美一级视频免费在线观看| 国产v综合ⅴ日韩v欧美大片| 国产精品成人一区二区三区吃奶| 91精品国产成人www| 亚洲精品影视在线观看| 亚洲成人av片在线观看| 精品久久久精品| 国产成人精品电影久久久| 欧美日韩亚洲视频一区| 91欧美精品成人综合在线观看| 久久在精品线影院精品国产| 国产精品久久久久久久av大片| 黄色精品在线看| 在线一区二区日韩| 欧美激情在线观看| 欧美日韩免费在线观看| 亚洲天堂av在线免费| 欧美日韩国产麻豆| 国产精品第3页| 日本欧美一级片| 91豆花精品一区| 亚洲字幕一区二区| 中文字幕在线亚洲| 久久久精品一区二区| 国产日韩欧美成人| 国产精自产拍久久久久久蜜| 另类图片亚洲另类| 国产亚洲人成a一在线v站| 九九九久久国产免费| 美女999久久久精品视频| 日韩少妇与小伙激情| 日韩精品在线观看网站| 2019日本中文字幕| 久久久久久网址| 777精品视频| 亚洲爱爱爱爱爱| 午夜精品久久久久久久99热浪潮| 亚洲日本成人网| 青青a在线精品免费观看| 欧洲成人性视频| 欧美大片欧美激情性色a∨久久| 日韩免费观看网站| 97高清免费视频| 亚洲国产精品字幕| 欧美激情伊人电影| 不卡伊人av在线播放| 亚洲国产另类 国产精品国产免费| 久久亚洲综合国产精品99麻豆精品福利| 最新69国产成人精品视频免费| 中文字幕久久久| 精品久久久香蕉免费精品视频| 日韩欧美中文第一页| 在线观看久久av| 精品国产欧美一区二区三区成人| 亚洲黄在线观看| 日韩电影中文 亚洲精品乱码| 伊人伊成久久人综合网站| 日韩亚洲第一页| 亚洲裸体xxxx| 亚洲欧洲一区二区三区在线观看| 久久久人成影片一区二区三区观看| 欧美黄色免费网站| 91在线看www| 欧美激情视频三区| 欧美一级淫片丝袜脚交| 国产福利精品av综合导导航| 日韩精品极品在线观看| 亚洲激情中文字幕| 国产精品xxx视频| 国产精品久久久久久久久久| 欧洲亚洲免费视频| 国产一区二区黑人欧美xxxx| 欧美成人亚洲成人日韩成人| 久热99视频在线观看| 亚洲国产精品成人va在线观看| 日本韩国欧美精品大片卡二| 久久久av一区| 亚洲成色777777女色窝| 在线观看日韩www视频免费| 亚洲国产另类久久精品| 欧美一级片免费在线| 亚洲国产精久久久久久久| 成人黄色av网站| 91精品久久久久久综合乱菊| 亚洲男人天堂古典| 久久久久久久电影一区| 国产美女扒开尿口久久久| 亚洲男人7777| 欧美激情va永久在线播放| 日本高清+成人网在线观看| 中文日韩电影网站| 精品福利一区二区| 日本91av在线播放| 亚洲最大福利网站| 国产成人亚洲综合| 日韩久久免费视频| 57pao成人国产永久免费| 国产精品一香蕉国产线看观看| 成人激情黄色网| 日韩欧美精品网站| 亚洲精品美女在线观看播放| 色婷婷综合久久久久| 国产精品草莓在线免费观看| 亚洲欧洲黄色网| 亚洲最大的成人网| 狠狠色香婷婷久久亚洲精品| 欧美丰满少妇xxxxx做受| 97视频免费观看| 日韩中文字幕不卡视频| 久久夜色精品国产亚洲aⅴ| 在线日韩精品视频| 日韩亚洲欧美成人| 亚洲精品之草原avav久久| 最近中文字幕mv在线一区二区三区四区| 久久久久久久影院| 国产中文字幕91| 91精品国产91久久久久久吃药| 久久久精品亚洲| 亚洲欧美制服第一页| 日本精品视频网站| 91在线网站视频| 日韩中文娱乐网| 精品成人乱色一区二区| 中文字幕av一区中文字幕天堂| 亚洲日本成人女熟在线观看| 91亚洲精品久久久久久久久久久久| 黄色91在线观看| 久久亚洲影音av资源网| 38少妇精品导航| 国产一区二区视频在线观看| 中文字幕成人精品久久不卡| 欧美国产日本在线| 精品国产乱码久久久久久婷婷|