私はいつも考えていた、copy
は、オブジェクトをコピーするだけです。ブロックの場合は少し違っていますが、私は実際にそれがどのように動作するのか驚いています。オブジェクト間のブロックのコピー
私が持っていると、インスタンスobjectA
と以下のクラスのobjectB
:
@interface MyObject : NSObject
@property(nonatomic, copy) void (^myHandler)(CGFloat progress);
@property(nonatomic) CGFloat progress;
@end
objectA
は空です。 objectB
には値が設定されています。アプリのいくつかの点では、私はobjectB
を破棄し、唯一objectA
を残したいので、私はobjectA
にobjectB
のこれら2つの値を挿入する必要があります。
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'プロパティを使用するコードで質問を更新してください。 – rmaddy
オブジェクトにブロックを使用しないでください。 javascriptから客観的になる開発者の悪い習慣です。あなたの場合、 'delegate'が必要です。ブロックは、非同期メソッドのコールバックとしてのみ使用する必要があります。 –
ハンドラがどのように使用されているかを見ることができるように、ハンドラを作成/割り当てるコードをobjectBに表示できますか? –