Autoreleasepool 和 dispatch_async

Posted

技术标签:

【中文标题】Autoreleasepool 和 dispatch_async【英文标题】:Autoreleasepool and dispatch_async 【发布时间】:2011-10-28 08:51:28 【问题描述】:

我看了一篇关于GCD的文章,有一个例子:

dispatch_queue_t bgQueue = myQueue;
dispatch_async(dispatch_get_main_queue(), ^
    NSString *stringValue = [[[textField stringValue] copy] autorelease];
    dispatch_async(bgQueue, ^
        // use stringValue in the background now
    );
);

如果我将该方法放在点击处理程序中(将在 autoreleasepool 中调用),我会丢失 stringValue,因为 autoreleasepool 将在点击事件后被销毁?

【问题讨论】:

【参考方案1】:

在那个内部块里面?不,你不会失去那个价值。当块内引用了 Objective-C 对象变量(尚未声明为 __block)并复制该块时,该对象将自动保留。当块被释放时,该对象也将被释放。 dispatch_async()负责复制和释放区块。

【讨论】:

以上是关于Autoreleasepool 和 dispatch_async的主要内容,如果未能解决你的问题,请参考以下文章

@autoreleasepool 在我的场景和 ARC 中是不是有意义?

Autoreleasepool 和 dispatch_async

`objc_autoreleasePoolPush()` 和 `objc_autoreleasePoolPop()` 函数和 `@autoreleasepool` 块

[iOS开发]@autoreleasepool原理探究

[iOS开发]@autoreleasepool原理探究

循环内的 Objective-C 循环和 @autoreleasepool 的 ARC 内存问题