iOS基本內(nèi)存管理:autorelease和autoreleasepool
1.autorelease 基本用法
- 對(duì)象執(zhí)行autorelease方法時(shí)會(huì)將對(duì)象添加到自動(dòng)釋放池中
- 當(dāng)自動(dòng)釋放池銷毀時(shí)自動(dòng)釋放池中所有對(duì)象作release操作
- 對(duì)象執(zhí)行autorelease方法后自身引用計(jì)數(shù)器不會(huì)改變,而且會(huì)返回對(duì)象本身
2.autorelease 的優(yōu)點(diǎn)
- autorelease實(shí)際上只是把對(duì)release的調(diào)用延遲了,對(duì)于每一次autorelease系統(tǒng)只是把該對(duì)象放入了當(dāng)前的autorelease pool中,當(dāng)該pool被釋放時(shí),該pool中的所有對(duì)象會(huì)被調(diào)用Release
-
因?yàn)橹挥性谧詣?dòng)釋放池銷毀的時(shí)候它里面的對(duì)象才銷毀,因此不用關(guān)心對(duì)象銷毀的時(shí)間也就不用關(guān)心什么時(shí)候調(diào)用release
3.autorelease 使用注意
- 操作占用內(nèi)存比較大的對(duì)象的時(shí)候不要隨便使用,擔(dān)心對(duì)象釋放的時(shí)間太遲
- 操作占用內(nèi)存比較小的對(duì)象可以使用
4.atureleasepool自動(dòng)釋放池
自動(dòng)釋放池存儲(chǔ)于內(nèi)存中的棧中遵循"先進(jìn)后出"原則
- #import <Foundation/Foundation.h>
- #import "Person.h"
- int main(int argc, const char * argv[])
- {
- // 自動(dòng)釋放池1
- @autoreleasepool {
- // 對(duì)象的釋放交給 自動(dòng)釋放池去管理 不用再寫(xiě)[person release]
- Person *person = [[[Person alloc] init] autorelease];
- // 再創(chuàng)建一個(gè)自動(dòng)釋放池2
- @autoreleasepool {
- Person *person2 = [[[Person alloc] init] autorelease];
- }
- Person *person3 = [[[Person alloc] init] autorelease];
- }
- return 0;
- }
從上面的代碼可以看出:執(zhí)行代碼時(shí)首先是person2對(duì)象先被銷毀,然后是外面的對(duì)象person和perons3 內(nèi)存中的表現(xiàn)如下:
5.使用常見(jiàn)錯(cuò)誤
- // 銷毀自動(dòng)釋放池的時(shí)候 要對(duì)person再執(zhí)行release操作的話 會(huì)報(bào)野指針錯(cuò)誤
- @autoreleasepool {
- Person *person = [[[Person alloc] init] autorelease];
- [person release];
- }
- // 對(duì)象執(zhí)行兩次autorelease意味著自動(dòng)釋放池銷毀的時(shí)候 對(duì)象會(huì)執(zhí)行兩次release操作 會(huì)報(bào)野指針錯(cuò)誤
- @autoreleasepool {
- Person *person = [[[[Person alloc] init] autorelease] autorelease];
- }