- 不要等到明天,明天太遙遠(yuǎn)拆祈,今天就行動(dòng)衡瓶。
須讀:看完該文章你能做什么优质?
知道對(duì)象什么時(shí)候才會(huì)加到autoreleasepool里面,
在autoreleasepool什么時(shí)候才釋放對(duì)象,
如何處理比較占用內(nèi)存的對(duì)象
學(xué)習(xí)前:你必須會(huì)什么?(在這里我已經(jīng)默認(rèn)你具備C語(yǔ)言的基礎(chǔ)了)
什么是autoreleasepool
一舌劳、本章筆記
項(xiàng)目1
1.一定要在自動(dòng)釋放池中 調(diào)用 autorelease,才會(huì)將對(duì)象方法自動(dòng)釋放池中
2. 在自動(dòng)釋放池中創(chuàng)建了對(duì)象,移動(dòng)要調(diào)用 autorelease,才會(huì)將對(duì)象放到自動(dòng)釋放池中
3.只要在自動(dòng)釋放池中 調(diào)用 autorelease, 就會(huì)將對(duì)象放入自動(dòng)釋放池中
4.一個(gè)程序中 可以創(chuàng)建N個(gè)自動(dòng)釋放池, 并且自動(dòng)釋放池 還可以嵌套
如果存在多個(gè)自動(dòng)釋放池的時(shí)候,自動(dòng)釋放池 是以 "棧"的形式存儲(chǔ)的
棧的特點(diǎn): 先進(jìn)后出
項(xiàng)目2
1.不要在自動(dòng)釋放池 使用比較消耗內(nèi)存的對(duì)象,占用內(nèi)存比較大的對(duì)象
2.盡量不要在自動(dòng)釋放池使用循環(huán), 特別是循環(huán)的次數(shù)非常多,并且非常占用內(nèi)存
二帚湘、項(xiàng)目1
main.m
#pragma mark 02-自動(dòng)釋放池注意事項(xiàng)
#pragma mark 概念
/*
注意點(diǎn):
1.一定要在自動(dòng)釋放池中 調(diào)用 autorelease,才會(huì)將對(duì)象方法自動(dòng)釋放池中
2. 在自動(dòng)釋放池中創(chuàng)建了對(duì)象,移動(dòng)要調(diào)用 autorelease,才會(huì)將對(duì)象放到自動(dòng)釋放池中
3.只要在自動(dòng)釋放池中 調(diào)用 autorelease, 就會(huì)將對(duì)象放入自動(dòng)釋放池中
4.一個(gè)程序中 可以創(chuàng)建N個(gè)自動(dòng)釋放池, 并且自動(dòng)釋放池 還可以嵌套
如果存在多個(gè)自動(dòng)釋放池的時(shí)候,自動(dòng)釋放池 是以 "棧"的形式存儲(chǔ)的
棧的特點(diǎn): 先進(jìn)后出
*/
#pragma mark - 代碼
#import <Foundation/Foundation.h>
#pragma mark 類(lèi)
#import "Person.h"
#pragma mark - main函數(shù)
int main(int argc, const char * argv[])
{
/*
Person *p = [[Person alloc]init];
@autoreleasepool {
// Person *p = [[Person alloc]init];
// [p run];
// 2. 在自動(dòng)釋放池中創(chuàng)建了對(duì)象,移動(dòng)要調(diào)用 autorelease,才會(huì)將對(duì)象放到自動(dòng)釋放池中
// Person *p = [[[Person alloc]init]autorelease];
// [p run];
// 3.只要在自動(dòng)釋放池中 調(diào)用 autorelease, 就會(huì)將對(duì)象放入自動(dòng)釋放池中
p = [p autorelease];
[p run];
}
// 1.一定要在自動(dòng)釋放池中 調(diào)用 autorelease,才會(huì)將對(duì)象方法自動(dòng)釋放池中
// Person *p = [[Person new]autorelease];
*/
// 4.一個(gè)程序中 可以創(chuàng)建N個(gè)自動(dòng)釋放池, 并且自動(dòng)釋放池 還可以嵌套
// 如果存在多個(gè)自動(dòng)釋放池的時(shí)候,自動(dòng)釋放池 是以 "棧"的形式存儲(chǔ)的
// 棧的特點(diǎn): 先進(jìn)后出
// 給一個(gè)對(duì)象方法 一條autorelease消息,永遠(yuǎn)會(huì)將對(duì)象 放到棧頂?shù)淖詣?dòng)釋放池
@autoreleasepool { // 創(chuàng)建第一個(gè)釋放池
@autoreleasepool { // 創(chuàng)建第一個(gè)釋放池
@autoreleasepool { // 創(chuàng)建第一個(gè)釋放池
Person *p = [[[Person alloc]init]autorelease];
[p run];
}// 第三個(gè) 釋放池 銷(xiāo)毀
}// 第二個(gè) 釋放池 銷(xiāo)毀
}// 第一個(gè) 釋放池 銷(xiāo)毀
return 0;
}
Person
>>>.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
- (void)run;
@end
>>>.m
#import "Person.h"
@implementation Person
- (void)run
{
NSLog(@"%s",__func__);
}
- (void)dealloc
{
NSLog(@"%s",__func__);
[super dealloc];
}
@end
三、項(xiàng)目2(02-自動(dòng)釋放池大對(duì)象問(wèn)題)
ViewController.m
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
/*
// 1.不要在自動(dòng)釋放池 使用比較消耗內(nèi)存的對(duì)象,占用內(nèi)存比較大的對(duì)象
@autoreleasepool {
Person *p = [[[Person alloc]init]autorelease];
// 加入p對(duì)象 只在100行的地方使用,以后都不用了
// 一萬(wàn)行代碼
}
*/
#warning 比較消耗內(nèi)存的做法
// 2.盡量不要在自動(dòng)釋放池使用循環(huán), 特別是循環(huán)的次數(shù)非常多,并且非常占用內(nèi)存
@autoreleasepool {
for (int i = 0; i<99999; ++i) {
// 每調(diào)用一次 都會(huì)創(chuàng)建一個(gè)新的對(duì)象
// 每個(gè)對(duì)象 都會(huì)占用一塊存儲(chǔ)空間
Person *p =[[[Person alloc]init]autorelease];
}
}// 只有執(zhí)行到這一塊,所有的對(duì)象才會(huì)被釋放
/*
for (int i = 0; i<99999; ++i) {
@autoreleasepool {
Person *p =[[[Person alloc]init]autorelease];
// 執(zhí)行到這一行,自動(dòng)釋放池 就釋放了
}
}
*/
NSLog(@"----");
}
@end
棧的分析圖
image.png