私はいつも、それcopy
はオブジェクトをコピーするだけだと思っていました。ブロックの場合は少し違いますが、以下の場合の動きには本当に驚きました。
次のクラスのインスタンスとインスタンスがありますobjectA
。objectB
@interface MyObject : NSObject
@property(nonatomic, copy) void (^myHandler)(CGFloat progress);
@property(nonatomic) CGFloat progress;
@end
objectA
空です。objectB
値が設定されています。objectB
アプリのある時点で、破棄して のみを残したいobjectA
ので、 to の次の 2 つの値を注入する必要があり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");
}];