日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

第六讲:Obj-C 内存管理4 - 自动释放池

發(fā)布時(shí)間:2024/8/23 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第六讲:Obj-C 内存管理4 - 自动释放池 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn):http://tigercat1977.blog.163.com/blog/static/2141561122012111294616203/

第六講:Obj-C 內(nèi)存管理4 - 自動(dòng)釋放池?

主要內(nèi)容
????? 什么是自動(dòng)釋放池
????? 自動(dòng)釋放池的好處
????? 如何創(chuàng)建一個(gè)自動(dòng)釋放池
????? 自動(dòng)釋放池如何釋放對(duì)象內(nèi)存

????? 自動(dòng)釋放池棧式結(jié)構(gòu)管理

Autorelease pool
???? 1. 自動(dòng)釋放池(Autorelease Pool)是 OC 的一種內(nèi)存自動(dòng)回收機(jī)制,可以將一些臨時(shí)變量通過(guò)自動(dòng)釋放吃來(lái)回收統(tǒng)一釋放
???? 2. 當(dāng)自動(dòng)釋放池本身銷(xiāo)毀的時(shí)候,池子里所有的對(duì)象都會(huì)做一次 release 操作

autorelease

????? 任何OC對(duì)象只要調(diào)用 autorelease 方法,就會(huì)把該對(duì)象放大離自己最近的自動(dòng)釋放池中(棧頂?shù)尼尫懦?#xff09;

創(chuàng)建自動(dòng)釋放池 (兩種方法)
?????? IOS5.0 新方式
???? @ autoreleasepool
????? {
????? }


????? IOS5.0 之前的老方式
????? NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

????? [pool release];


遛狗原理


典型例子(正確)
????? Dog *dog1 = [[Dog alloc] init];
????? [xiaoLi setDog:dog1];
???? [dog1 release];

典型例子 (錯(cuò)誤)
????? [xiaoLi setDog:[[Dog alloc] init]];
????? 上述代碼有內(nèi)存泄漏

典型例子(正確)好的方法
???? Dog *dog = [[[Dog alloc] init] autorelease];
????? [xiaoLi setDog:dog1];
????? //這里不能跟 [dog1 release];

典型例子(正確) 放成一行
????? [xiaoLi setDog:[[[Dog alloc] init] autorelease]];

黃金法則
????? 如果對(duì)一個(gè)對(duì)象使用了 alloc, [mutable]copy, retain,那么必須使用相應(yīng)的 release 或者 autorelease

舉例

// Dog.h #import <Foundation/Foundation.h> @interface Dog : NSObject { int _ID; } @property int ID; @end

// Dog.m #import "Dog.h" @implementation Dog @synthesize ID = _ID; - (void) dealloc { NSLog(@"dog %d dealloc", _ID); [super dealloc]; } @end


// Person.h #import <Foundation/Foundation.h> #import "Dog.h" @interface Person : NSObject { Dog *_dog; } @property (retain) Dog *dog; @end

// Person.m #import "Person.h" @implementation Person @synthesize dog = _dog; - (void) dealloc { self.dog = nil; NSLog(@"person dealloc"); [super dealloc]; } @end


// main.m #import <Foundation/Foundation.h> #import "Person.h" #import "Dog.h" int main (int argc, const char * argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSLog(@"Hello, World!"); Person *xiaoLi = [[Person alloc] init]; Dog *dog1 = [[[Dog alloc] init] autorelease]; // 把 dog1 這條狗放在自動(dòng)釋放池里,上邊的pool中 NSLog(@"dog1 retaincount is %ld", [dog1 retainCount]); xiaoLi.dog = dog1; NSLog(@"dog1 retaincount2 is %ld", [dog1 retainCount]); // [dog1 release]; // autorelease 了,不需要再 release [xiaoLi release]; NSLog(@"dog1 retaincount3 is %ld", [dog1 retainCount]); [pool release]; NSLog(@"end of release"); return 0; } /* 輸出結(jié)果 Hello, World! dog1 retaincount is 1 dog1 retaincount2 is 2 person dealloc dog1 retaincount3 is 1 dog 0 dealloc end of release */






?

?

轉(zhuǎn)載于:https://www.cnblogs.com/jackljf/archive/2013/03/07/3589250.html

總結(jié)

以上是生活随笔為你收集整理的第六讲:Obj-C 内存管理4 - 自动释放池的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。