//
// 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. css3 绘制书本

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  2. Git的使用及托管代码到GitHub

    首先Git是一个开源的分布式版本控制工具,用git创建代码仓库. 仓库(Repository)是用于保存版本管理所需信息的地方,本地代码 提交到 代码仓库中,如果需要还可以 再推送到 远程仓库中. 所 ...

  3. canves应用

    canves用得好可以有好多效果: html:<canvas id="myCanvas" width="700" height="300&quo ...

  4. JS高级——apply与call

    上下文调用模式 可以修改this的值,也就是可以修改函数的调用方式,apply.call可以修改函数调用上下文,也就是this的值 <script> var name = "莱昂 ...

  5. jsessionid什么时候生成并传递到前端的?

    jsessionid什么时候生成并传递到前端的?     如果客户端请求的cookie中不包含JSESSIONID,服务端调用request.getSession()时就会生成并传递给客户端,此次响应 ...

  6. (转)Struts2访问Servlet的API及......

    http://blog.csdn.net/yerenyuan_pku/article/details/67315598 Struts2访问Servlet的API 前面已经对Struts2的流程已经执行 ...

  7. kvm virt-install 使用小结

    简介: virt-install 能够为KVM.Xen或其它支持libvrit API的hypervisor创建虚拟机并完成GuestOS安装. 此外,它能够基于串行控制台.VNC或SDL支持文本或图 ...

  8. vue跨域问题解决(生产环境)

    vue跨域问题解决(使用webpack打包的) 配置代理:(config下index.js文件) module.exports = { dev: { env: require('./dev.env') ...

  9. Jmeter读取excel表中用例数据实现接口压测

    传统的接口测试,都是在接口中手动输入不同用例准备的多种场景参数数据,一遍一遍的输入来执行多个不同的用例,但是现在利用excel表格准备各种类型的数据,使用Jmeter中Jmeter CSV Data ...

  10. JAVA经典题--计算一个字符串中每个字符出现的次数

    需求:  计算一个字符串中每个字符出现的次数 思路: 通过toCharArray()拿到一个字符数组--> 遍历数组,将数组元素作为key,数值1作为value存入map容器--> 如果k ...