`

objective-c 内存管理之 "autorelease"的一个疑问

    博客分类:
  • iOS
阅读更多

autorelease的用法我了解,但是我一直有一个疑问:

 

比如说项目中我没有加其他的 NSAutoreleasePool ,也就是说项目中只有 主线程中的那个 NSAutoreleasePool.

我现在有(就拿NSString举例了)

 

- (IBAction)clickBtn:(id)sender

{

     NSString *string = [[NSString alloc] initWithString:@"1234567890"];

     [string autorelease];

}

 

我一直不明白的是,这个string什么时候被释放呢?

刚开始看obj-c的介绍书籍时,书上说: 每一个autorelase会将该变量注册到一个自动线程池,当线程池销毁时,会给该对象发一个relase消息,并将其销毁."

对于这个说法我很是疑惑,要真是这样,比如说我只有一个主线程中的 NSAutoreleasePool,我程序中那些autorelease的对象就只能等到主线程中的NSAutoreleasePool销毁时被销毁. 那也就是说,要等到程序退出了,这些对象才会被销毁.

很显然这个说法是有问题的.

 

这两天空闲的时间比较多,,终于把这个问题给弄明白了.

首先,关于autorelease,我找到了比较权威的说法:

 

---------------

Objects set to auto-release mean that they do not need to be explicitly released because they will be released when an auto-release pool is popped. The iPhone has an auto-release pool that runs on the main thread which usually releases objects at the end of an event loop. When you create your own threads, you must create your own auto-release pool.

---------------

from : http://www.codeproject.com/KB/iPhone/avoidiphoneleaks.aspx?display=Mobile

(在Eric Sadun的<< the iphone developer's cookbook>> 2rd 也有这样的介绍)

 

也就是说,一个autorelease的对象在事件结束后会被主线程的自动释放池释放掉.

比如上面 clickBtn:中的string,它会在这个方法结束后被立即释放.

 

至此,,这个问题就算是回答完毕了,最后补充三点:

1.程序中所有的NSAutoreleasePool对象都会被加到一个"栈"中,当你将一个对象定义为autorelease时,"栈"中最上面的NSAutoreleasePool对象负责管理的该对象的销毁.

2.碰到一些不明白的问题,很简单写个小程序,不费什么功夫.

3.刚开始学习一个新的技术,不能只看一本书,书毕竟是人写的,难免有疏漏或误导之处.

 

 

0
3
分享到:
评论

相关推荐

    Objective-C课大三作业.rar

    内容概要:这份作业包含了多个Objective-C案例,涵盖了成员变量的引用、set与get方法、继承、多态、self关键字、点语法、init方法重写、自定义构造方法、description方法、野指针错误、autorelease和自动释放池、...

    前端开源库-node-circleci-autorelease

    前端开源库-node-circleci-autorelease节点circleci autorelease,在circleci上创建释放标记

    Google Objective-C Style Guide 中文版

    Google Objective-C Style Guide 中文版 目录 例子 空格与格式 空格与制表符 行宽 方法声明与定义 方法调用 @public与@private 异常 协议 命名 文件名 Objective-C++ 类名 分类名 Objective-C方法名 变量名 注释 ...

    Objective-c对象组装XML

    -tag 1- 测试无内存泄露 1 创建数据对象() NSMutableDictionary *map = [[NSMutableDictionary alloc]init]; [map setObject:@"a" forKey:@"author"]; [map setObject:@"b" forKey:@"title"]; [map set...

    详细描述了Object-C中的内存管理,超级简单

    在这种模型下,每个对象都有一个与之相关的引用计数器,每当对象被一个新的引用所指向时,该计数器增加;当引用被释放时,计数器减少。如果引用计数达到零,对象所占用的内存将被回收,对象本身则被销毁。Objective-...

    mulle-clang::ID_button:用于mulle-objc的Objective-C编译器

    这是一个基于clang 10.0.0的Objective-C编译器,是为运行时编写的。 它对应于mulle-objc-runtime v0.17或更高版本。 有关的更多信息,请参见 。 编译器可用于: 编译mulle-objc的Objective-C代码 编译C代码 不...

    Programming in Objective-C 4th Edition

    An Objective-C Class for Working with Fractions 30 The @interface Section 33 Choosing Names 34 Class and Instance Methods 35 The @implementation Section 37 The program Section 39 Accessing Instance ...

    Objective C Memory Management Essentials(PACKT,2015)

    Objective-C Memory Management Essentials will familiarize you with the basic principles of Objective-C memory management, to create robust and effective iOS applications. You will begin with a basic ...

    Objective-C学习之ARC的实现方法

    “自动引用计数(ARC)是一个编译器级的功能,它能简化Cocoa应用中对象生命周期管理(内存管理)的流程。” ARC使内存管理在大部分时候变得如同小事一桩,但我们仍要在决定自己的类如何管理其它对象的引用

    objective-c-tutorial:这是我在学习时编写的所有目标c教程代码

    客观教学这是我在学习时编写的所有目标c教程代码#基本语法正常的printf操作NSlog示例autoRelease池示例#NSString操作NSString操作在这里NSRange示例NSMutableString示例#NSArray示例NSArray示例NSArray函数示例...

    02-内存管理1

    1&gt; 系统自带的绝大数类方法返回的对象,都是经过autorelease的4.block在ARC中和MRC中的用法有什么区别,需要注意什么1.对于没有引用外部变量

    Node.js-mysql-autoRelease:node.js mysql事务自动释放连接

    Node.js-mysql-autoRelease node.js mysql transaction Auto Release connection\ 实现Node.js中连接池自动回收连接功能

    IOS高级内存管理编程指南.pdf

    介绍IOS内存管理的一本电子书,初学者可以很快的了解ios上的内存管理的机制,有一定经验的也可以从中得到新的收获。

    iPhone开发、ObjectiveC_面试题目

    2、在一个对象的方法里面: self.name = “object”;和 name =”object” 有什么不同吗? 3、这段代码有什么问题吗: @implementation Person - (void)setAge:(int)newAge { self.age = newAge; } @end 4...

    在非ARC环境下的内存管理

    这是一个简单的内存管理的示例,在非ARC的环境下,如何管理内存

    object-c基础教程

    大纲  开始吧 ... 内存管理 o Retain and Release(保留与释放) o Dealloc o Autorelease Pool  Foundation Framework Classes o NSArray o NSDictionary  优点与缺点  更多信息

    autorelease-github:通过 GitHub API 为您的构建管道自动发布

    这是一个非常简单的项目,它需要 N 个文件并使用 bash、curl 和 jq 通过上传它们。 它旨在成为构建管道中的嵌入式发布构建。 输入是一堆文件和一个放入 artifacts 文件夹中的属性文件。 例如: artifacts/foo-42...

    详解iOS应用开发中的ARC内存管理方式

    ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain、release、autorelease语句。你不再需要担心内存管理,因为编译器为你处理了一切 注意:ARC 是编译器特性,...

    有时侯我们需要延迟一个对象的引用计算减一操作

    我们需要先创建一个auto release pool,才能有效地实现autorelease机制,否则会导致内存泄露。当一个对象obj发送autorelease消息时,会发生如下过程:

    AutoReleaseTool:自动部署桌面应用程序的CICD工具

    通过在完整的CI / CD管道配置中使用AutoRelease,为您的桌面应用程序创建新版本并将其部署到其用户所需的全部过程很简单: 将您的更改推送到定义的github版本分支触发一个webhook,该webhook将在 WM中启动构建过程...

Global site tag (gtag.js) - Google Analytics