【问题标题】:Under ARC, are Blocks automatically copied when assigned to an ivar via the property?在 ARC 下,当通过属性分配给 ivar 时,块是否会自动复制?
【发布时间】:2012-05-12 04:04:08
【问题描述】:

假设

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]; 来确保将块从堆栈复制到堆。但是观看 WWDC 2011 的 Session 322 - Objective-C Advancements in Depth(第 25 分钟),演讲者说 ARC 会自动处理将块分配给 ivar。我只是想确定一下。

【问题讨论】:

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


    【解决方案1】:

    熊山,

    实际上,确保块被复制的最简单方法是将@property 设置为使用复制。如:

    @property (copy, nonatomic) MyResponseHandler ivarResponseHandler;
    

    它可以满足您的一切需求。

    安德鲁

    【讨论】:

    • 不直接回答问题。但我想我现在会在我的代码中使用这种模式。
    • (两年后)我刚刚问了一个非常相似的问题来回答你的问题:Should I still copy/Block_copy the blocks under ARC?。答案的一般结论是,即使在当今,为块编写属性的形式(这里接受的答案)也是绝对正确和正确的形式。
    【解决方案2】:

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

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

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

    【讨论】:

    • 非常感谢。回答了我的问题等等。
    • bearMountain,我不知道将它分配给 ivar 时会发生什么。坦率地说,我真的不想依赖编译器会做什么。我知道它在分配给副本@property 时被复制。我也知道您可以直接将分配的块自己复制到 ivar。在这两种情况下,都没有歧义。我更喜欢总是使用@propertys。安德鲁
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    相关资源
    最近更新 更多