我一直认为,这copy
只会复制对象。在块的情况下,它有点不同,但我真的很惊讶它在以下情况下是如何工作的。
我有一个实例objectA
和objectB
以下类:
@interface MyObject : NSObject
@property(nonatomic, copy) void (^myHandler)(CGFloat progress);
@property(nonatomic) CGFloat progress;
@end
objectA
是空的。objectB
设置了值。在应用程序的某个点,我只想丢弃objectB
和离开objectA
,所以我需要注入这两个值objectB
to 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");
}];