【发布时间】:2016-04-04 15:24:38
【问题描述】:
我一直认为copy 只会复制对象。在块的情况下,它有点不同,但我真的很惊讶它在以下情况下是如何工作的。
我有以下类的 objectA 和 objectB 实例:
@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