博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oc53--autorelease注意事项
阅读量:7093 次
发布时间:2019-06-28

本文共 2588 字,大约阅读时间需要 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://qqnql.baihongyu.com/

你可能感兴趣的文章
树莓派安装docker
查看>>
oracle之 Oracle LOB 详解
查看>>
机器学习相关——协同过滤
查看>>
一文看懂考恩2017 AI研究报告:2020年AI市场规模将达4000亿美元
查看>>
5Python全栈之路系列之IO多路复用
查看>>
Linux相关网络知识梳理
查看>>
物联网全面升级,十年内推动工业进入智能化新阶段
查看>>
8Manage项目管理:实现企业信息化管理转型
查看>>
Android之assets资源
查看>>
android精要——Service
查看>>
centos6.5通过ftp下载源码包解压出错出错
查看>>
菜鸟学Linux 第099篇笔记 haproxy
查看>>
Windows常用命令
查看>>
菜鸟学Linux 第053篇笔记 Section 3
查看>>
jquery.multiSelect下拉框多选
查看>>
linux下使用shell脚本自动化部署项目
查看>>
shell查询当前时间
查看>>
e1000 detected Tx Unit Hang
查看>>
nginx自定义站点目录及简单编写开发网页内容讲解
查看>>
查询是谁在用挂载的硬盘
查看>>