【问题标题】:Copy block between objects在对象之间复制块
【发布时间】:2016-04-04 15:24:38
【问题描述】:

我一直认为copy 只会复制对象。在块的情况下,它有点不同,但我真的很惊讶它在以下情况下是如何工作的。

我有以下类的 objectAobjectB 实例:

@interface MyObject : NSObject
@property(nonatomic, copy) void (^myHandler)(CGFloat progress);
@property(nonatomic) CGFloat progress;
@end

objectA 为空。 objectB 设置了值。在应用程序的某个点,我想丢弃objectB,只留下objectA,所以我需要将objectB这两个值注入objectA

MyObject *objectA = [MyObject new];
if (nowIWantToGetRidOfB) {
    objectA.progress = objectB.progress;
    objectA.myHandler = objectB.myHandler;
    objectB.myHandler = nil;
    objectB = nil; // that's just an example to show it gets released after this code
}

我希望将块复制到新的objectA 实例并释放objectB(因为没有指向它的引用)。

但是,什么都没有发生。该块,即使它应该,也永远不会再次评估。我应该以其他方式复制它吗?有人可以解释发生了什么以及为什么会发生或指向一些可以解释它的文档吗?

-- 编辑--

片段如何设置块:

MyObject *objectB = [MyObject new];
objectB.progress = 0.5f;
[objectB setProgressHandler:^(CGFloat progress) {
    NSLog(@"example");
}];

【问题讨论】:

  • 使用在objectA 上使用myHandler 属性的代码更新您的问题。
  • 不要将块与对象一起使用。从 javascript 到 Objective-c 的开发人员是不好的做法。在您的情况下,您需要delegate。块应该只用作异步方法的回调。
  • 您能否展示创建/分配处理程序给 objectB 的代码,以便我们了解它是如何使用的。
  • 我认为你的代码sn-ps不足以解决问题。 objectB 什么时候制作的?
  • @Cy-4AH 我不会说那么严格,但事实上,区块被选为代表的频率太高了。

标签: objective-c objective-c-blocks nscopying


【解决方案1】:

除了我评论中的问题,这可能无论如何都行不通。

块不仅是代码的 sn-p,而且是闭包。这意味着他们会对创建的时间点进行快照。如果这样的块在创建时引用objectB,则在复制后它们仍将引用该对象,即使您将块或其副本存储到objectA。 (实例对象没有标识符,但是,我想我明白你的意思了。)

所以,有这个代码:

MyObject *objectB = …;
objectB.handler = ^(CGFloat progress)
{
  … objectB …
}

objectB 会做一些事情。复制后(此处明确)……

MyObject *objectA = …;
objectA.handler = objectB.handler;

... 还是一样:objectB 会做一些事情,因为它仍然被块引用。

【讨论】:

  • 即使在块内有简单的 NSLog,所以不使用 objectB 完成了我描述的方式。我已经完成了将整个对象替换为内部块并且它完全正常工作。
猜你喜欢
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多