本文共 2667 字,大约阅读时间需要 8 分钟。
//// main.m// autorelease注意事项#import#import "Person.h"int main(int argc, const char * argv[]) { Person *p1 = [[Person alloc] init]; @autoreleasepool { Person *p2 = [[[Person alloc] init] autorelease]; [p2 run]; // 2.在自动释放池中创建了对象, 一定要调用autorelease,才会将对象放入自动释放池中 Person *p3 = [[Person alloc] init]; [p3 run]; // 3.只要在自动释放池中调用autorelease, 就会将对象放入自动释放池,即使p1在外面定义的。 p1 = [p1 autorelease]; [p1 run]; } // 1.一定要在自动释放池中调用autorelease, 才会将对象放入自动释放池中 Person *p4 = [[[Person alloc] init] autorelease]; // 4.一个程序中可以创建N个自动释放池, 并且自动释放池还可以嵌套 // 如果存在多个自动释放池的时候, 自动释放池是以 "栈" 的形式存储的 // 栈的特点: 先进后出 // 给一个对象方法发送一条autorelease消息, 永远会将对象放到栈顶的自动释放池 @autoreleasepool { // 创建第一个释放池 @autoreleasepool { // 创建第二个释放池 @autoreleasepool { // 创建第三个释放池 Person *p = [[[Person alloc] init] autorelease];//放在第三个自动释放池里面,因为第三个释放池在最上面。 [p run]; } // 第三个释放池销毁,会将p释放。 Person *p1 = [[[Person alloc] init] autorelease];//放在第二个释放池里面,因为第二个池子在最上面, }// 第二个释放池销毁,此时p1会销毁 }// 第一个释放池销毁 @autoreleasepool { // 千万不要写多次autorelease,一个alloc, new对应一个autorelease Person *p1 = [[[[Person alloc] init] autorelease] autorelease];//当池子销毁的时候会发送2次release消息,过度释放。 // 如果写了autorelease就不要写release // 总之记住: 一个alloc/new对应一个autorelease或者release Person *p = [[[Person alloc] init] autorelease]; [p release]; } return 0;}
//// ViewController.m// 自动释放池大对象问题//// Created by xiaomage on 15/6/26.// Copyright (c) 2015年 xiaomage. All rights reserved.//#import "ViewController.h"#import "Person.h"@interface ViewController ()@end@implementation ViewController- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ /* // 1.不要再自动释放池中使用比较消耗内存的对象, 占用内存比较大的对象 @autoreleasepool { Person *p = [[[Person alloc] init] autorelease]; // 假如p对象只在100行的地方使用, 以后都不用了 // 一万行代码,p对象需要在一万行时候释放,p一直占用着内存。 } */ // 2.尽量不要再自动释放池中使用循环, 特别是循环的次数非常多, 并且还非常占用内存 @autoreleasepool { for (int i = 0; i < 99999; ++i) { // 每调用一次都会创建一个新的对象 // 每个对象都会占用一块存储空间 Person *p = [[[Person alloc] init] autorelease]; } } // 只有执行到这一行, 所有的对象才会被释放 /* for (int i = 0; i < 99999; ++i) { @autoreleasepool { Person *p = [[[Person alloc] init] autorelease]; } // 执行到这一行, 自动释放池就释放了 } */ NSLog(@"--------");}@end
本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/7428901.html,如需转载请自行联系原作者