ios – 将Objective-C块定义为属性 – 最佳实践

我最近遇到了一个 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,了解有关堆栈与堆栈的更多信息.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...