Objective-c中autorelease的释放时机

如果你使用过MRR,autorelease这个关键字应该是太熟悉了,每次在我们生成一个新的对象返回时,都需要向这个对象发送autorelease消息,目的是为了延时释放创建的对象。那到底是在什么时候,这个对象会被释放呢?有什么方法可以更快的释放一个autorelease对象呢?

咱们先来看一个现象:

@property (weak, nonatomic) NSString *weakString;

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    NSString *hello = [[NSString alloc] initWithCString:"it will be released at the end of current runloop" encoding:NSUTF8StringEncoding];

    self.weakString = hello;
    NSLog(@"%@ - %@", self.weakString, NSStringFromSelector(_cmd));
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    NSLog(@"%@ - %@", self.weakString, NSStringFromSelector(_cmd));
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    NSLog(@"%@ - %@", self.weakString, NSStringFromSelector(_cmd));

    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"-2--%@ - %@", self.weakString, NSStringFromSelector(_cmd));
    });
}

我们创建了一个viewDidLoad方法中创建了一个weak指针指向一个字符串,当代码执行到viewWillAppear:和viewDidAppear:时,我们依然可以打印出weak指针指向的字符串,当在viewDidAppear:中在下一个runloop中执行打印操作时,weak指针就指向nil了,Why ?

我们完全可以这么翻译这条语句到MRR:self.weakString = hello

self.weakString = [[hello retain] autorelease];

这样看,我们是不是可以猜测autorelease的对象是在当前的runloop结束后就被释放掉了呢?

我们要厘清的事情可能有以下几个方面:

1)autorelease pool

时间: 2024-10-20 00:10:09

Objective-c中autorelease的释放时机的相关文章

75. Autorelease机制及释放时机

Autorelease机制是iOS开发人员管理对象内存的好伙伴.MRC中.调用[obj autorelease]来延迟内存的释放是一件简单自然的事:ARC下,我们甚至能够全然不知道Autorelease 系统就能管理好内存.而在这背后,objc和编译器都帮我们做了哪些事呢.一起来探究下Autorelease机制吧. 概述 当向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自己主动释放池.它仍然是个正当的对象,因此自己主动释放池定义的作用域内的其他对象能

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

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

OC基础(十三)autorelease自动释放池

autorelease 自动释放池 autorelease是一种支持引用计数的内存管理方式,只要给对象发送一条autorelease消息,会将对象放到一个自动释放池中,当自动释放池被销毁时,会对池子里面的所有对象做一次release操作 优点:不用再关心对象释放的时间,不用再关心什么时候调用release 原理:autorelease实际上只是把对release的调用延迟了,对于每一个autorelease,系统只是把该 Object放入了当前的autorelease pool中,当该pool被

Autorelease自动释放池的使用

Autorelease自动释放池的使用 使用ARC开发,只是在编译时,编译器会根据代码结构自动添加了retain.release和autorelease. MRC内存管理原则:谁申请,谁释放 遇到alloc/copy/retain 都需要添加release或autorelease autorelease 只是一个标记,表明会延迟释放 当一个autorelease对象超出自己的作用域后,会被添加到离他最近的autorelease pool中,当pool开始倾倒的时候,会向池里面所有的对象发送一次r

UIViewController中view的释放过程

第一.viewDidUnload方法 1.调用时机: 内存吃紧时,在iPhone OS 3.0之前didReceiveMemoryWarning是释放无用内存的唯一方式,但是OS 3.0及以后viewDidUnload方法是更好的方.当系统内存吃紧的时候会调用该方法,释放view,释放的view必须是已经在内存的view,即通过viewdidload之后的view,而不是controller,在iphone应用程序,可以controller已经创建,但是view可以没有进内存,另外该方法不会是v

Delphi 中的自动释放策略

http://www.cnblogs.com/del/archive/2011/12/21/2295794.html Delphi 中的自动释放策略 一.指定 Owner 后, 随 Owner 连带释放: //uses Vcl.StdCtrls, Vcl.ExtCtrls; var   panel: TPanel; procedure TForm1.Button1Click(Sender: TObject); begin   panel := TPanel.Create(Self);   pan

objective C中的字符串(三)

holydancer原创,如需转载,请在显要位置注明: 转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7343561 objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的操作字符串,下面举几个例子: 1.创建: 直接利用等号赋值 NSString *

Unity3D中可中途释放的单例

Unity3D中可中途释放的单例 使用静态类,静态变量的坏处是从程序加载后就一直占用内存,想要释放比较麻烦,可是之前使用的单例,没有提供释放的方法,那是不是也同静态的一样直到程序结束菜释放?那单例的好处是什么? 所以此处在单例中加入了可释放的方法来方便释放单例. 用途是: 用此单例管理场景物体时,在不切换场景的前提下释放掉该单例以及挂在单例游戏物体下的子物体 using UnityEngine; public abstract class SingleBhv<T> : IMono where

objective C中继承、协议、分类和多态的实现

第一.objective C中继承的实现 在oc中只有实例变量会有权限控制,实例方法和类方法是没有权限控制的,这点与c++不同,OC默认的是protected,并且在声明权限控制时,没有分号 在OC中可以像C++一样用指针运算法来访问实例变量 Rectangle.h 文件代码: #import <Foundation/Foundation.h> @interface Rectangle : NSObject { int _width; int _height; } @property (non