我最近遇到了一个
Apple document,它显示了一个块的以下属性声明:
@interface XYZObject : NSObject @property (copy) void (^blockProperty)(void); @end
另外,这篇文章说:
Note: You should specify copy as the property attribute,because a block needs to be copied to keep track of its captured state outside of the original scope. This isn’t something you need to worry about when using Automatic Reference Counting,as it will happen automatically,but it’s best practice for the property attribute to show the resultant behavior. For more information,see Blocks Programming Topics.
我也阅读了建议的Blocks Programming Topics,但没有发现任何相关的.
我仍然很好奇,为什么将块属性定义为“副本”是最佳做法.如果您有一个很好的答案,请尝试区分ARC和MRC差异,如果有的话.
谢谢
解决方法
默认情况下,在堆栈上创建块.这意味着他们只存在于创建的范围内.
如果以后要访问它们,则必须通过向块对象发送复制消息将其复制到堆中.一旦检测到块需要在其创建的范围之外,ARC将为您执行此操作.作为最佳实践,您将声明任何块属性作为副本,因为这将是自动内存管理的方式.
阅读Mike Ash的Stack and Heap Objects in Objective-C,了解有关堆栈与堆栈的更多信息.