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

本文共 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,如需转载请自行联系原作者

你可能感兴趣的文章
MongoDB权威指南读书笔记(一)
查看>>
vue之vue router
查看>>
Python:Tornado 第四章:Tornado网站部署:第二节:静态文件
查看>>
Java资源免费分享,每日一更新,找到你心仪的吧
查看>>
8步安装多多客小程序全插件化1.0开源版
查看>>
webpack4基础配置
查看>>
Dubbo分析之Protocol层
查看>>
工业物联网中的PLC、DCS、FCS都是什么?区别是什么?
查看>>
【DL-CV】批量归一化(BN算法)
查看>>
Java反射-属性
查看>>
前端开发实用工具类函数
查看>>
如何设计RESTful API?
查看>>
成为一个合格前端的正确姿势
查看>>
jQuery入门、jQuery选择器、jQuery操作
查看>>
JS数组专题1️⃣ ➖ 数组扁平化
查看>>
【开源】Netty轻松实现聊天室,附带数据记录,聊天历史
查看>>
使用Angular轻松搭建CMS页面
查看>>
在Java中,你真的会日期转换吗
查看>>
JavaScript实现简单二叉查找树
查看>>
[CSS]关于盒子模型
查看>>