`

autorelease对象具体什么时候释放?

    博客分类:
  • IOS
 
阅读更多
在项目中,会有一个默认的Autorelease pool,程序开始时创建,程序退出时销毁,按照对Autorelease的理解,岂不是所有autorelease pool里的对象在程序退出时才release, 这样跟内存泄露有什么区别?

答案是,对于每一个Runloop, 系统会隐式创建一个Autorelease pool,这样所有的release pool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。

那什么是一个Runloop呢? 一个UI事件,Timer call, delegate call, 都会是一个新的Runloop。

“Application kit”在一个事件循环里会自动创建一个”autorelease pool”。像鼠标键的按下与释放,所以你编写的代码通常不需要考虑太多这方面的事情。当然,有以下三种情况你会创建与销毁自己的Pool实例:

    1,应用不是基于”Application Kit”,像”Command-line tool”,因为它并没有内置的”autorelease pools”的支持。
    2,创建线程,你必需在线程开始时创建一个”Autorelease Pool”实例。反之,会造成内存池露(会在以后的文章详细说明线程与池的技巧)。
    3,一个循环内创建了太多的临时对象,你应该为他们创建一个”Autorelease Pool”对象,并在下次循还前销毁它们。
分享到:
评论

相关推荐

    cocos2dx3.2关于自动释放池的demon源代码

    当对象不再需要时,无需显式调用`release`,因为它们会在适当的时候自动释放。这使得代码更加简洁,减少了内存泄漏的风险。 三、自动释放池的实现 Cocos2dx 3.2的自动释放池由`CC AutoreleasePool`类实现,其核心...

    Objecttive-C

    如果通过某些便利构造器创建对象,或者通过某些方法间接得到对象,那么这些对象的所有权可能不由当前对象拥有,这时就不需要对它们进行额外的release或autorelease操作。 综上所述,Objective-C的内存管理机制是...

    2018iOS一份高级面试题

    **autorelease** 是Objective-C中的一种内存管理机制,它允许对象暂时地被托管在自动释放池中,在池被清空时对象才被释放。当一个对象被发送`autorelease`消息后,它会被放入最近的自动释放池中。这种机制减少了...

    iOS内存暴增问题追查与使用陷阱.docx编程资料

    - 如果通过`alloc`、`new`或`copy`、`mutableCopy`创建对象,则必须调用`release`或`autorelease`来释放内存。 - 如果没有正确释放,将导致内存泄漏。 - **2.1.2 谁retain,谁释放** - 当发送`retain`消息给某个...

    IPad应用开发实战

    自动释放池会在适当的时候(通常是当控制返回到顶级事件处理函数时)执行释放操作,从而批量释放多个对象,提高效率。 #### 便捷方法 便捷方法(convenience methods)是指一些提供便利的构造方法或类方法,它们...

    iOS-面试宝典3.0.pdf

    什么时候应该使用通知,什么时候应该使用KVO,它们的实现上有什么区别吗?如果用protocol和delegate(或者delegate的Array)来实现类似的功能可能吗?如果可能,会有什么潜在的问题?如果不能,为什么? - **...

    ios(OC部分)经典面试题大全ios(OC部分)经典面试题大全

    - **自动释放**:使用 `autorelease` 方法创建的对象会自动放入自动释放池中。在程序的适当位置调用 `drain` 方法时,自动释放池中的对象会被自动释放。 - **对象获取**:通过其他方式(如方法返回值)获取的对象...

    iOS面试题2019年度总结188题(下).pdf

    ### 第90题:`dealloc`方法的执行时机是什么时候? - `dealloc`方法在对象即将被销毁时调用。通常在这个方法中释放对象持有的资源,比如释放内存中的数据结构,关闭打开的文件等。确保在`dealloc`中正确释放资源是...

    OC 中的内存管理

    - **关于自动释放池块**(About Autorelease Pool Blocks):自动释放池块(autorelease pool block)是一种特殊的内存管理结构,用于批量释放对象。 - **使用局部自动释放池块减少峰值内存消耗**(Use Local ...

    object-c学习笔记

    - `string`方法创建的字符串对象是自动释放的,意味着系统会在适当的时候自动调用`release`方法释放内存。 - 手动创建对象使用`alloc-init`组合,即`[NSString alloc] init]`,先分配内存,然后初始化对象。手动...

    2015年上半年的iOS面试及笔试集锦

    NSAutoreleasePool用于临时存储并适时释放那些被autorelease的对象,特别是在循环或并发环境中。 面试题.zip可能会涵盖更广泛的iOS面试问题,除了内存管理,还可能包括: 4. KVO(Key-Value Observing)和KVC(Key...

    ARC探秘:Objective-C中的自动引用计数革命

    有时候,我们需要显式地告知ARC将一个对象的所有权从一个变量转移到另一个变量。这可以通过使用`__bridge`或`__bridge_transfer`关键字来实现。 ```objc CFStringRef cfString = CFStringCreateWithCharacters...

    内存管理奋斗

    6. **NSArray的使用**:使用`arrayWithObject:`创建的NSArray对象是autorelease的,因此不需要手动释放。它们会在适当的时间被自动释放。 7. **JSON解析的内存管理**:在解析JSON数据时,可能产生内存泄露。使用如...

    100家企业iOS面试题(下)

    - ** autorelease**:当一个对象被标记为自动释放时,它会被放入最近的自动释放池中,等到该池被排空时,该对象会被释放。这种方式有助于避免内存泄漏,并简化代码。 #### 题目89:什么是保留(retain)? - **...

    iPhone开发、ObjectiveC_面试题目

    1. `alloc`与`dealloc`、`retain`与`release`的关系:`alloc`是创建对象并分配内存,`dealloc`用于释放对象内存,而`retain`增加对象的引用计数(`retain count`),`release`减少引用计数。与`alloc`配对使用的是`...

    02-内存管理1

    - 大多数系统类方法返回的对象都是`autorelease`的,这意味着它们会在适当的时间被释放。但这并不是所有类方法的通用规则,开发者应了解具体类的行为。 4. **Block的内存管理**: - 无外部变量引用的Block属于`__...

    iphone面试题秘籍 apple开发必备

    1. **Objective-C中的内存管理原则**:遵循谁创建谁释放的原则,即使用`alloc`、`copy`、`new`、`retain`创建的对象应使用`release`或`autorelease`来释放。 2. **内存泄漏常见场景及解决办法**:避免忘记释放对象...

    02-内存管理

    然而,并不是所有的类方法都会返回autorelease对象。具体取决于实现细节和类的设计。 #### 四、Block在ARC与非ARC环境中的差异 1. **类型**:对于没有引用外部变量的Block,在ARC或非ARC环境下,其类型通常都是`__...

    [Objective-C.程序设计(第4版)].(斯蒂芬).林冀等.扫描版

    当对象被autorelease后,它会被放到一个autorelease池中,在适当的时候被释放。 #### 3. ARC 随着Objective-C的发展,Apple在Xcode 4.4及之后版本中引入了ARC,这大大简化了内存管理。ARC自动处理了对象的引用计数...

    Learn objective c

    1. **Autorelease方式**:使用`[NSString string]`这样的语法创建的对象会自动添加到autorelease pool中,这意味着你无需手动调用`release`方法来释放这些对象,它们会在适当的时候由系统自动回收。 2. **alloc/...

Global site tag (gtag.js) - Google Analytics