、autorelease使用注意

)并不是放到自动释放池中,都会自动加入到自动释放池

1.1) 因为没有调用autorelease方法,所以对象没有加入到自动释放池.

int main(){
@autoreleasepool{
Student *s = [[Student alloc] init];
[s release]; // 正常释放
}
return ;
} 1.2)在自动释放池的外部发送autorelease不会被加入到自动释放池中。 int main(){
@autoreleasepool{ }
// 发送autorelease消息的对象,放到制动释放池外部
// 此时无法被自动释放
Student *s = [[[Student alloc] init] autorelease];
return ;
} 1.3)不管对象是在自动释放池里创建,还是自动释放池外创建,只要在自动释放池内写1个[s autorelease];s就会被放到自动释放池中,注意:autorelease是一个方法,且只有在自动释放池中使用才有效。
int main(){
// 不管在自动释放池内部还是外部创建
Student *s = [[Student alloc] init];
@autoreleasepool{
[s autorelease]; // 此时s加入到释放池
}
return ;
} )自动释放池的嵌套使用
自动释放池是栈结构。
栈:先进后出。后进先出,

int main(int argc, const char * argv[]) {
@autoreleasepool {
// 第一个池子,里面创建no的1学生
Student *s = [[[Student alloc] init] autorelease];
s.no = ;
@autoreleasepool {
// 第二个池子,里面创建no2的学生
Student *s2 = [[[Student alloc] init] autorelease];
s2.no = ;
@autoreleasepool {
// 第二个池子,里面创建no3的学生
Student *s3 = [[[Student alloc] init] autorelease];
s3.no = ;
}
}
}
return ;
}
释放顺序:s3,s2,s1
)自动释放池中不适合放占用内存空间较大的对象
> 尽量避免对大内存使用该方法,对于这种延迟释放机制,尽量少用
> 不要把大量循环操作放到同1个自动释放池中,这样会造成内存峰值的上升。 、autorelease错误用法
、连续调用多次autorelease。
@autoreleasepool {
Student *s = [[[Student alloc] autorelease] autorelease];// 调用了两次autorelease,对象过度释放。
} 、对象创建在释放池外,但是在释放池内进行autorelease后,在释放池外,又进行了release。
int main(int argc, const char * argv[]) {
Student *s = [[Student alloc] init];
@autoreleasepool {
[s autorelease];// 此时出池子后,对象可以被释放
}
[s release];// 对象被释放后再次调用释放,会出错。
return ;
} 、alloc之后调用了autorelease,之后又调用release。
int main(int argc, const char * argv[]) {
@autoreleasepool {
Student *s = [[[Student alloc] init] autorelease];
[s release];
}
return ;
} 、alloc之后调用release。 int main(int argc, const char * argv[]) { @autoreleasepool {
// 因为release没有返回值,所以这样调用是错误的。
Student *s = [[[Student alloc] init] release];
} return ;
}

0c-35-自动释放池使用注意的更多相关文章

  1. OC中对象元素的引用计数 自动释放池的相关概念

    OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念 一.数组对象是如何处理对象元素的引用计数问题[objc]  view plaincopy 1. //   2. / ...

  2. Autorelease自动释放池的使用

    Autorelease自动释放池的使用 使用ARC开发,只是在编译时,编译器会根据代码结构自动添加了retain.release和autorelease. MRC内存管理原则:谁申请,谁释放 遇到al ...

  3. OC 内存泄露 自动释放池

    花絮:看到下面的代码就想起这么一个调侃: 一个老程序员,功成名就,金盆洗手不在写代码后,决定练练书法.提笔思索良久后在纸上写下:Hello world! /********************** ...

  4. autoreleasepool自动释放池

     示例: @autoreleasepool { ; i[largeNumber; i++) { (因识别问题,该行代码中尖括号改为方括号代替) Person *per = [[Person alloc ...

  5. OC之property和自动释放池

    property实例 property参数 自动释放池 一.property实例 1.前边的例子我们看到,我们在一个类中如果用到另外一个类的实例作为自己的成员变量时,通常需要在setter方法中,先r ...

  6. OC12_自动释放池

    // // Dog.h // OC12_自动释放池 // // Created by zhangxueming on 15/6/18. // Copyright (c) 2015年 zhangxuem ...

  7. OC11_自动释放池

    // // Dog.h // OC11_自动释放池 // // Created by zhangxueming on 15/6/18. // Copyright (c) 2015年 zhangxuem ...

  8. Objective c 自动释放池

    学IOS 的大家都知道,IOS 一共有三种内存管理方式:MRC .ARC.自动释放池.我按照我个人的理解简述一下自动释放池,希望能给大家一点帮助,如有错误请大家及时批评指正. 自动释放池有几个特点:1 ...

  9. 04-OC属性的使用、自动释放池、封装和继承

    目录: 一.IOS6声明式属性的使用 二.autoreleasepool自动释放池 三.封装.继承 回到顶部 一.IOS6声明式属性的使用 注:声明式属性默认情况下,并没有解决内存问题, 当使用@pr ...

  10. iOS 之 自动释放池

    向一个对象发送autorelease消息时,cocoa会将该对象的一个引用放入最新的自动释放池.作用域结束时,自动释放池会被释放,池中所有的对象也就被释放了.

随机推荐

  1. Axure rp 基础知识 转

    首先做个声明:此次教程里为了快速完成,借用了一些网上已有教程的图文,不是剽窃,只图方便.另外,因为汉化版本可能功能名称等略有差别,请自行理解. 名词解释: 线框图:一般就是指产品原型,比如:把线框图尽 ...

  2. STL源码剖析读书笔记--第四章--序列式容器

    1.什么是序列式容器?什么是关联式容器? 书上给出的解释是,序列式容器中的元素是可序的(可理解为可以按序索引,不管这个索引是像数组一样的随机索引,还是像链表一样的顺序索引),但是元素值在索引顺序的方向 ...

  3. Yii 1 数据库操作 笔记

    $result = array( 'id'=>null, 'val'=>0 ); $row1 = Yii::app()->db->createCommand()->ins ...

  4. 为operamasks增加HTML扩展方式的组件调用

    #为operamasks增加HTML扩展方式的组件调用 ##背景 之前的[博文](http://www.cnblogs.com/p2227/p/3540858.html)中有提及到,发现easyui中 ...

  5. 【原创】用JAVA实现大文件上传及显示进度信息

    用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/grayprince/UploadBigFil ...

  6. 《Linux设备驱动程序》 笔记2

    驱动代码hello.c #include <linux/init.h> #include <linux/module.h> static int hello_init(void ...

  7. Linux下的paste合并命令详解

    paste单词意思是粘贴.该命令主要用来将多个文件的内容合并,与cut命令完成的功能刚好相反. 粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相同.paste将按行将不同文件行信息放在一 ...

  8. Hibernate理论

    1.什么是Hibernate? Hibernate是数据持久层的一个轻量级框架.数据持久层的框架有很多比如:iBATIS,myBatis,Nhibernate,Siena等等.并且Hibernate是 ...

  9. 【Android框架进阶〖0〗】ThinkAndroid注解机制

    由于项目需要,开始研究ThinkAndroid. 个人认为该框架的注解机制十分新颖,所以先研究这个,顺便学习下 Java 的annotation. 粗略的看了看,该机制在BaseActivity中初始 ...

  10. poj 1247 The Perfect Stall 裸的二分匹配,但可以用最大流来水一下

    The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16396   Accepted: 750 ...