1.autorelease使用注意

  • 并不是放到自动释放池代码中,都会自动加入到自动释放池
 @autoreleasepool {
// 因为没有调用 autorelease 方法,所以对象没有加入到自动释放池
Person *p = [[Person alloc] init];
[p run];
}
  • 在自动释放池的外部发送autorelease 不会被加入到自动释放池中
  1. autorelease是一个方法,只有在自动释 放池中调用才有效。
 @autoreleasepool {
}
// 没有与之对应的自动释放池, 只有在自动释放池中调用autorelease才会放到释放池
Person *p = [[[Person alloc] init] autorelease];
[p run]; // 正确写法
@autoreleasepool {
Person *p = [[[Person alloc] init] autorelease];
} // 正确写法
Person *p = [[Person alloc] init];
@autoreleasepool {
[p autorelease];
}
  • 自动释放池的嵌套使用
  1. 自动释放池是以栈的形式存在
  2. 由于栈只有一个入口, 所以调用autorelease会将对象放到栈顶的自动释放池
  3. 栈顶就是离调用autorelease方法最近的自动释放池
@autoreleasepool { // 栈底自动释放池
@autoreleasepool {
@autoreleasepool { // 栈顶自动释放池
Person *p = [[[Person alloc] init] autorelease];
}
Person *p = [[[Person alloc] init] autorelease];
}
}
  • 自动释放池中不适宜放占用内存比较大的对象
  1. 尽量避免对大内存使用该方法,对于这种延迟释放机制,还是尽量少用
  2. 不要把大量循环操作放到同一个 @autoreleasepool 之间,这样会造成内存峰值的上升
// 内存暴涨
@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];
}
}

2.autorelease错误用法

  • 不要连续调用autorelease
 @autoreleasepool {
// 错误写法, 过度释放
Person *p = [[[[Person alloc] init] autorelease] autorelease];
}
  • 调用autorelease后又调用release
 @autoreleasepool {
Person *p = [[[Person alloc] init] autorelease];
[p release]; // 错误写法, 过度释放
}

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

  1. oc53--autorelease注意事项

    // // main.m // autorelease注意事项 #import <Foundation/Foundation.h> #import "Person.h" ...

  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. 使用.NET 6开发TodoList应用(15)——实现查询搜索

    系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 本文我们继续来看查询过程中的另外一个需求:搜索.搜索的含义是目标字段的全部或者部分值匹配请求中的搜索条件,对应到数据库层面是C ...

  2. Java高级程序设计笔记 • 【第4章 网络编程】

    全部章节   >>>> 本章目录 4.1 网络基础知识 4.1.1 IP地址 4.1.2 端口号 4.1.3 使用InetAddress 4.1.4 InetAddress 类 ...

  3. Kerberos加密级别不支持的问题

    1.问题现象 Zookeeper开启kerberos认证后出现如下问题,不支持的加密级别: 2017-02-23 09:20:57,048 [myid:1] - WARN [NIOWorkerThre ...

  4. CentOS7中安装pip的方法

    1.安装epel-release [root@localhost ~]# yum -y install epel-release 2.安装python-pip [root@localhost ~]# ...

  5. [流畅的Python]第一章数据模型

    这些来自同一家出版社的动物书 像是计算机科学界一盏盏指路明灯 余幼时 初试读 学浅 以为之晦涩难懂 像是老学究咬文嚼字 现在看起来还有些有趣 其实理工男大多都很有趣 这一章介绍了 怎么样去视线一个带有 ...

  6. (转)Make 命令

    Make 命令 代码变成可执行文件,叫做编译(compile):先编译这个,还是先编译那个(即编译的安排),叫做构建(build). Make是最常用的构建工具,诞生于1977年,主要用于C语言的项目 ...

  7. linux 安装mysql 可能遇到的小问题

    问题一. ./mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No ...

  8. 《剑指offer》面试题68 - II. 二叉树的最近公共祖先

    问题描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q ...

  9. seq2seq+torch7聊天机器人bug处理

    [C]: in function 'error' ...root1/torch/install/share/lua/5.2/rnn/recursiveUtils.lua:44: in function ...

  10. Cesium源码剖析---Ambient Occlusion(环境光遮蔽)

    Ambient Occlusion简称AO,中文没有太确定的叫法,一般译作环境光遮蔽.百度百科上对AO的解释是这样的:AO是来描绘物体和物体相交或靠近的时候遮挡周围漫反射光线的效果,可以解决或改善漏光 ...