objective-c - 在 ARC 下,当通过属性分配给 ivar 时, block 是否会自动复制?

标签 objective-c properties automatic-ref-counting objective-c-blocks

假设

typedef void (^MyResponseHandler) (NSError *error);
@property (strong, nonatomic) MyResponseHandler ivarResponseHandler;
synthesize ivarResponseHandler = _ivarResponseHandler;

- (void)myMethod:(MyResponseHandler)responseHandler
{
    self.ivarResponseHandler = responseHandler;
    ...
}

通过@property 赋值给ivar 是否正确?我知道在手动内存管理中,您需要 self.ivarResponseHandler = [responseHandler copy]; 来确保 block 从堆栈复制到堆。但是在观看 2011 年 WWDC session 322 - Objective-C 的深入进展(第 25 分钟)时,演讲者说 ARC 自动处理将 block 分配给 ivar。我只是想确认一下。

最佳答案

ARC 在您发布的代码中自动为您执行复制。

如果您将 block 转换为 id,ARC 将不会为您执行复制。例如,在这段代码中,ARC 不会执行复制,因为 addObject: 的参数类型是 id:

NSMutableArray *array = [NSMutableArray array];
[array addObject:responseHandler];

关于objective-c - 在 ARC 下,当通过属性分配给 ivar 时, block 是否会自动复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10417851/

相关文章:

ios - AF网络2.0 : AFHTTPRequestOperationManager asynchronous methode invoke

ios - 自定义 UIDynamicBehavior : how do I know the total number of animation steps/ticks?

c# - 已编译的 lambda 表达式用作属性 getter 和 setter : wrong benchmarking method or wrong lambda expression construction?

objective-c - 局部变量会导致 ARC 内存泄漏吗?

objective-c - Objective C - iOS - UIWebView 保留在 ARC 中,但未调用委托(delegate)方法

iphone - 当应用程序转到后台时,我的 View Controller 被释放

ios - Objective-C SpriteKit – 如何制作圆形按钮

ios - 从类返回 NSURLConnection 数据

android - 未从 ~/.gradle/gradle.properties 读取 Gradle 属性

objective-c - 为什么只读属性仍然允许使用 KVC 写入