//
// main.m
// autorelease注意事项 #import <Foundation/Foundation.h>
#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 ;
}
//
// 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 = ; i < ; ++i) {
// 每调用一次都会创建一个新的对象
// 每个对象都会占用一块存储空间
Person *p = [[[Person alloc] init] autorelease];
}
} // 只有执行到这一行, 所有的对象才会被释放 /*
for (int i = 0; i < 99999; ++i) {
@autoreleasepool {
Person *p = [[[Person alloc] init] autorelease];
} // 执行到这一行, 自动释放池就释放了
}
*/
NSLog(@"--------");
} @end

oc53--autorelease注意事项的更多相关文章

  1. autorelease注意事项

    1.autorelease使用注意 并不是放到自动释放池代码中,都会自动加入到自动释放池 @autoreleasepool { // 因为没有调用 autorelease 方法,所以对象没有加入到自动 ...

  2. OC基础(16)

    autorelease基本使用 autorelease注意事项 *:first-child { margin-top: 0 !important; } body > *:last-child { ...

  3. OC基础笔记目录

    OC基础(1) Objective-C简介 OC和C对比 第一个OC程序 面向对象思想 OC基础(2) 类与对象 类的设计 第一个OC类 对象方法的声明和实现 类方法的声明和实现 OC基础(3) 对象 ...

  4. OC-ARC,类扩展,block

    总结 标号 主题 内容 一 autorelease autorelease基本概念/自动释放池/autorelease基本使用 二 autorelease注意事项 注意点/应用场景 三 ARC 什么是 ...

  5. PhoneGap在iOS开发下的注意事项

    敏捷个人应用主要是在Andorid下开发,发布的也主要是Andorid.之所以没有急着退出iOS版本,主要是因为开发iOS需要iOS的开发环境,发布还需要开发者账号,这些都需要资源或钱.而最近越来越多 ...

  6. Objective-C 【autorelease基本使用】

    ------------------------------------------- NSString中的内存管理问题 由于autoreleasepool的存在,对于内存管理就会很复杂,retain ...

  7. objective-C 的内存管理之-自动释放池(autorelease pool)

    如果一个对象的生命周期显而易见,很容易就知道什么时候该new一个对象,什么时候不再需要使用,这种情况下,直接用手动的retain和release来判定其生死足矣.但是有些时候,想知道某个对象在什么时候 ...

  8. 用xib自定义UITableViewCell的注意事项——重用

    问题的提出: 有时候我们经常需要自定义tableView的cell,当cell里面的布局较为复杂时往往舍弃纯代码的方式而改用xib的方式进行自定义.当我们用纯代码的方式布局cell时,往往会在cell ...

  9. iPhone SDK中多线程的使用方法以及注意事项

    多线程iphonethreadapplication编程嵌入式 然现在大部分PC应用程序都支持多线程/多任务的开发方式,但是在iPhone上,Apple并不推荐使用多线程的编程方式.但是多线程编程毕竟 ...

随机推荐

  1. 关于idea failed to start SceneBuilder 的解决方法

    问题描述: javaFx无法启动SceneBuilder. 问题原因: SceneBuilder不正当配置. 解决方法:1. 下载SceneBuilder   https://www.oracle.c ...

  2. Contact

    UF3000: 1.wafer进去prober后,默认probercard不会跟chuck上的wafer接触. 2.通过prober界面上的按钮向上移动,使得prober card和wafer的距离为 ...

  3. C#——接口的意义以及与抽象类的区别

    接口的意义是什么呢?接口与抽象类又有什么区别?什么情况选择用接口?什么情况选择用抽象类? 接口的意义: 1.实际开发中的约束作用,继承接口的类必须实现接口规定的方法,方便多人开发中的协同,避免随意性. ...

  4. C# 学习——静态(第四天)

    一.命名空间 类似于文件夹,而类就是文件夹中的文件: 作用:明确的指向我们所需要的类的 所在的位置: 统一命名空间下,类名不能重复. 二.类 概念:具有相同属性和功能的对象的抽象的集合. 三.静态与实 ...

  5. java 操作clob

    之前在学校的时候做的都是练习,小儿科,遇到的情况完全都在自己的设想范围内.最近老是遇到字段溢出的情况,但是varchar2好像最长也只有4000个字符.所以不得不另辟蹊径,就找上了clob字段. pa ...

  6. nginx-配置反向代理实例

    nginx反向代理配置及优化 2009-05-26 作者:守住每一天blog:liuyu.blog.51cto.combbs:bbs.linuxtone.orgmsn:liuyubj520#hotma ...

  7. SpringMVC(四)@RequestParam

    使用@RequestParam可以将URL中的请求参数,绑定到方法的入参上,并通过@RequestParam的3个参数进行配置 Modifier and Type Optional Element D ...

  8. session_start(): open(/var/lib/php/session/sess_tlrp3cpro7gun9uhno8n6futr3, O_RDWR)

    在安装一个网站,结果连接上数据库了但是一直报错.下面贴报错内容和图 错误提示 系统:PHP (Linux) 错误类型:WARNING 内容:session_start(): open(/) 错误位置: ...

  9. Html5 WebSocket详细介绍

    什么是WebSocket?看过html5的同学都知道,WebSocket protocol 是HTML5一种新的协议.它是实现了浏览器与服务器全双工通信(full-duplex).HTML5定义了We ...

  10. C# MVC ajax上传 文件

    用普通的ajax提交表单的时候,不能把文件流传到后端去,所以要用到jquery.form.js jquery.form.js到官网下载或者从这里下载:http://pan.baidu.com/s/1c ...