【问题标题】:Are Objective-C blocks autoreleased?Objective-C 块是自动发布的吗?
【发布时间】:2011-01-12 09:46:55
【问题描述】:

如果我声明一个像 ^{ DoSomething; } 这样的块并将其放入实例变量中,如果我要保留它,是否需要 Block_copy()

【问题讨论】:

标签: objective-c objective-c-blocks


【解决方案1】:

是的,您需要复制。不是因为它们是自动释放的,而是因为它们从堆栈开始。请注意,块的行为也类似于常规的 Objective-C 对象,因此您可以使用常规的 copy 消息复制它们:

void storeBlockForLater: (dispatch_block_t) block
{
    [someArray addObject:[[block copy] autorelease]];
}

或者,如果你有一个块属性:

@property(copy) dispatch_block_t block;

保留在这里没有帮助。

【讨论】:

  • 谢谢,我还发现了这篇关于这个主题的精彩文章:cocoawithlove.com/2009/10/how-blocks-are-implemented-and.html
  • 是的;如果您使用copy,请使用release。如果您使用Block_copy(),请使用Block_release()。不要混合它们。
  • @bbum 使用Block_copy()autorelease 是否安全?你应该只使用autoreleasecopy吗?
  • @openfrog:你仍然需要复制块,但仅此而已。你不必——也不能——释放或自动释放它。
猜你喜欢
  • 2010-11-16
  • 2011-05-20
  • 2012-06-25
  • 2011-08-04
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
相关资源
最近更新 更多