`

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》 内存管理.pdf

    此外,Objective-C还提供了自动释放池(Autorelease Pool),允许对象在自动释放池中注册后,由自动释放池来管理内存的释放时机。 为了简化代码,Objective-C引入了宏定义来帮助开发者自动执行释放内存的操作。例如...

    objective-c内存管理

    Objective-C还提供了一个自动释放池(autorelease pool),可以在一定程度上简化内存管理。当对象被添加到自动释放池后,它会在适当的时候自动释放。 - **对象自动释放**:新生成的对象只需要调用`autorelease`方法...

    iPhoneMac_Objective-C内存管理教程和原理剖析.pdf

    ### Objective-C内存管理教程和原理剖析 #### 一、前言 Objective-C 是一种面向对象的编程语言,广泛应用于苹果的 macOS 和 iOS 开发中。由于 Objective-C 的内存管理机制与现代高级语言如 Java 或 .Net 的自动垃圾...

    Objective-C中的Autorelease Pool揭秘:深入理解自动释放机制

    此外,Objective-C 的内存管理机制也是其核心组成部分之一,尤其是 Autorelease Pool 这一概念,在现代 Objective-C 编程中扮演着至关重要的角色。 #### 1. Autorelease Pool 基础 Autorelease Pool 是 Objective-...

    objective-c 内存管理Demo

    在Objective-C中,内存管理主要依赖于引用计数(Reference Counting)机制,后来在iOS 5.0引入的ARC(Automatic Reference Counting)自动管理了大部分内存操作。以下是对`alloc`, `init`, `release`这三个关键字的...

    Objective-C2.0程序设计第二版中文版及代码

    2. **内存管理**:Objective-C 2.0引入了自动引用计数(ARC),大大简化了内存管理。开发者不再需要手动调用`retain`、`release`和`autorelease`,而是由编译器自动处理。 3. **分类与协议**:Objective-C允许对已...

    Objective-C

    Objective-C是在C语言的基础上扩展了Smalltalk式的面向对象特性,使得它既有C语言的强大功能,又具备了面向对象编程的灵活性。 在Objective-C中,类是所有对象的基础。类定义了一组属性(实例变量)和方法(函数)...

    Effective Objective-C 2.0

    3. 内存管理:在Objective-C中,内存管理是编程的一个重要方面,它涉及对象的创建和释放。传统上,Objective-C使用引用计数(Reference Counting)来进行内存管理,直到引入自动引用计数(Automatic Reference ...

    Objective-C内存管理教程和原理剖析

    Objective-C的内存管理机制是基于手动管理的,与.NET和Java的自动垃圾回收机制不同。在Objective-C中,对象在堆上创建,并需要一个指针来保持对其的引用。例如,`ClassA *obj1 = [[ClassA alloc] init];` 这句代码...

    Objective-C内存管理课件.doc

    内存管理是编程中至关重要的部分,Objective-C 在内存管理方面采用了引用计数(Reference Counting)策略,直到iOS 5.0后引入了ARC(Automatic Reference Counting),但这并不改变对旧版内存管理机制的理解。...

    objective-c编程 第2版=objective-c program 2nd edition_13889311

    10. **实践项目**:一个好的编程教材通常会包含实践项目,让读者将所学知识应用到实际开发中,这可能是创建一个简单的iOS应用或解决特定的编程挑战。 通过阅读"Objective-C编程 第2版",无论是初学者还是有经验的...

    Objective-C基础教程源代码 Learn objective-C on the Mac Mark Dalrymple著书

    2. **对象和类**:Objective-C中的所有事物都是对象,每个对象都属于一个类。了解如何创建自定义类,继承现有类,以及使用协议(@protocol)来实现多态性是关键。 3. **消息传递**:Objective-C的核心机制是消息...

    Objective-C2.0程序设计习题官方答案

    6. **内存管理**:Objective-C使用引用计数(ARC,Automatic Reference Counting)进行内存管理。学习何时创建和释放对象,理解`retain`、`release`、`autorelease`等方法,以及ARC如何自动处理这些。 7. **GCD...

    iPhone Mac Objective-C内存管理教程和原理剖析

    //...} // obj1 会被自动释放,因为它是自动释放池内的对象```了解了这些基本概念后,你就能更好地理解 Objective-C 的内存管理机制,避免内存泄漏和意外崩溃。实践中,掌握好这些原则并结合 Xcode 的内存分析工具...

    Objective-C语言教程与案例.zip

    4. **内存管理**:Objective-C使用引用计数(Reference Counting)进行内存管理,也可能涉及自动引用计数(ARC)的概念。学习者需要理解retain、release、autorelease等关键字的用法。 5. **Interface Builder与...

    Objective-C示例代码1

    8. **内存管理**:Objective-C使用引用计数(ARC)来管理内存,`retain`、`release`和`autorelease`等关键字可能在`FractionDemo`的实现中出现。 9. **KVC(Key-Value Coding)和KVO(Key-Value Observing)**:...

Global site tag (gtag.js) - Google Analytics