【读书笔记】iOS-自动释放池

一,NSObject类提供了一个autorelease方法:

-(id)autorelease;

该方法预先设定了一条将来在某个时间发送的release消息,其返回值是接收消息的对象。retain消息采用了相同的技术,使嵌套调用更加容易。当给一个对象发送autorelease消息时,实际上是将该对象添加到NSAutoreleasePool中。当自动释放池被销毁时,会向该池中所有对象发送release消息。

二,

NSAutoreleasePool *pool;

pool=[[NSAutoreleasePool alloc]init];

...

[pool release];

创建一个自动释放池时,该池自动成为活动的池。释放该池时,其保留计数器值归0,然后,该池被销毁。在销毁过程中,该池释放其包含的所有对象。

当使用AppKit时,Cocoa定期自动为你创建和销毁自动释放池。通常是在程序处理完当前事件(如鼠标点击或按键)以后执行这些操作。你可以使用做任意多的自动释放对象,当不再使用它们时,自动释放池将自动为你清理这些对象。

三,你可能已经在Xcode的自动生成代码中遇见过另一种销毁自动释放池中对象的方式:-drain方法。该方法只是清空自动释放池而不销毁它。-drain方法只适用于MAC OS X 10.4及更高版本。在我们自己编写(而不是由Xcode生成)的代码中,我们使用-release方法,因为该方法适用于Mac OS的所有版本。

参考资料:《Object-C基础教程》

时间: 2024-10-13 15:09:03

【读书笔记】iOS-自动释放池的相关文章

ios自动释放池

自动释放池以栈的形式实现:当你创建一个新的自动释放池时,它将被添加到栈顶.接收autorelease消息的对象将被放入到最顶端的自动释放池中.如 果将一个对象放入一个自动释放池中,然后创建一个新的自动释放池再销毁该新建的自动释放池,则这个自动释放对象仍将存在,因为容纳该对象的自动释放池仍然 存在. 什么是自动释放池 1.Autorelease pool 自动释放池(Autorelease pool)是OC的一种内存自动回收机制,可以将一些临时变量通过自动释放池来回收统一释放.自动释放池本事销毁的

Objective-C(十六、内存管理,自动释放池,ARC,强指针,弱指针,方法族)——iOS开发基础

结合之前的学习笔记以及参考<Objective-C编程全解(第三版)>,对Objective-C知识点进行梳理总结.知识点一直在变,只是作为参考,以苹果官方文档为准~ 十六.内存管理相关知识(二) 1.autorelease,自动释放机制 - (instancetype)autorelease; (1)自动释放池的创建 iOS5.0之前 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; //进行一系列操作 //此处不可以使用

黑马程序员-OC学习笔记之autorelease与自动释放池

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.autorelease autorelease与release相似,是OC中的一个对象方法.这两个方法都能把对象的引用计数器减1,但是release是一个精确的减1,对对象的操作只能在release之前进行,如果是在之后,就会出现野指针错误:而autorelease是一个不精确的引用计数器减1,当给对象发送autorelease消息时,对象就会被放到自动

iOS 多线程 自动释放池常见面试题代码

同步:代码依次执行,一个人执行多个任务,也是依次执行.一个人在同一时间只执行一个任务 异步:可以同时执行多个任务 进程:指在系统中运行的应用程序,每个进程都是独立的,都有独立的且安全的运行空间 线程:一个进程可以有多个线程,但只有一个主线程.进程的任务都是在线程里面完成的. 进程,线程与多线程之间的关系? 进程=公司     线程 = 员工    多线程 = 老板 多线程可以解决程序阻塞问题,也可以提高程序的执行效率 自动释放池常见面试题代码 p.p1 { margin: 0.0px 0.0px

OC基础笔记——自动释放池

autorelease:延长对象生命周期 把对象放到离自己最近那个自动释放池中 当自动释放池销毁的时候,它会把放在其中所有对象进行一次release的操作 它和对象在哪里创建没有关系 自动释放池的原理: 1.系统中存在一个自动释放池栈, 当遇到 @autoreleasepool { 把这个自动释放池压入栈中 2.但遇到与之对应 } 自动释放池,出栈,它出栈的时候,会对池中所有对象进行一次release操作 3.自动释放池栈中,只有栈顶自动释放池是活动的,其他的都在休眠 4.当你调用autorel

ios中的自动释放池

自动释放池中是否有虑重功能 1 @autoreleasepool { 2 UIView *view = [UIView alloc] init] autorelease]; 3 [view autorelease]; 4 } 这样写在自动释放池的队列中是两个对象还是一个对象,就是说把view加到自动释放池的队列时,队列本身是否对内容进行了虑重 防止对象的重复添加,比较view里面在队列中了,再次调用autorelease时还有没有作用. 于是写了一个测试代码 1 - (BOOL)applicat

【iOS开发-34】自动释放池@autoreleasepool的使用注意事项以及ARC机制——面试必考内容

自动释放池@autorelease面试频率可能会吧release还要高. (1)在自动释放池@autoreleasepool{}中alloc一个对象后(如p1),仍然需要用[p1 autorelease];只是这个语句和[p1 release];不同,后者表示把p1的retainCount-1,而前者仅仅表示把p1放到自动释放池中返回一个self,自动释放池结束销毁时,统一对里面的对象引用计数retainCount-1. (2)@autoreleasepool{}可以随意创建,也可以嵌套使用.

手动内存管理和自动释放池

手动内存管理 在进行内存管理的时候要注意内存管理的准则:谁开辟内存,谁释放内存(谁污染的谁治理) .开辟内存之后,对象的引用计数为1,只有继承自NSObject的对象才有内促管理的概念, 当对象引用计数为0的时候对象的内存会被清理. 下列关键字会开辟内存,对象引用计数器+1 alloc new copy mutableCopy 下列是内存管理的相关方法. retain :保留对象,对象的引用计数器+1. release : 释放对象,对象引用计数器-1. retainCount : 获取对象当前

关于 MRC下自动释放池 的嵌套使用的几个问题

假定存在 Person 这个对象,分析如下代码的对象在何时释放 #import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) {         Person *p1 = nil;         @autoreleasepool     {         p1 = [[Person alloc] init];     // p1 1     }  

黑马程序员----内存管理之四——《autorelease自动释放池》

内存管理之四——autorelease自动释放池 1.autorelease的基本使用 此对象方法会将对象放到一个自动释放池内: 当自动释放池被销毁时,就会对池子内的所有对象做一次release操作: 此方法会返回对象本身: 调用完此方法后,对象计数器的值不变,只有到自动释放池被销毁时才会对对象做一次release操作: 2.autorelease的好处 不用在关心对象被销毁的时间: 不用关心什么时候调用release操作: 3.autorelease的使用注意 占用内存较大的对象不要随便使用a