もし私が Apple のエンジニアだったら、あなたの問題はおそらくあなたの設計にあると主張するでしょう。dealloc
自分自身を行動させるのではなく、見ることによって効果的に行動したいと思う理由はほとんどありませんdealloc
。
[大幅な編集が続きます: 弱いプロパティは通常のプロパティ メカニズムを通過しないため、最初に提案された内部の暗黙的な KVO を含め、KVO に準拠していません]
そうは言っても、できることは、オブジェクトの関連付けを介して 2 つのオブジェクトの有効期間をバインドし、前者の割り当て解除のコールアウトとして後者の割り当て解除を使用することです。
だから、例えば
#import <objc/runtime.h>
@interface DeallocNotifier;
- (id)initWithObject:(id)object target:(id)target action:(SEL)action;
@end
@implementation DeallocNotifier
- (id)initWithObject:(id)object target:(id)target action:(SEL)action
{
... blah ...
// we'll use a static int even though we'll never access by this key again
// to definitely ensure no potential collisions from lazy patterns
static int anyOldKeyWellNeverUseAgain;
objc_setAssociatedObject(object, &anyOldKeyWellNeverUseAgain, self, OBJC_ASSOCIATION_RETAIN);
... blah ...
}
- (void)dealloc
{
[_target performSelector:_action];
}
@end
-(void)run{
arr = ...
[[DeallocNotifier alloc]
initWithObject:arr target:self action:@selector(arrayDidDealloc)];
/* you may not even need *arr in this case; I'm unclear as
to why you have an instance variable for something you don't
want to keep, so I guess it'll depend on your code */
} // end of run
- (void)arrayDidDealloc
{
NSLog(@"array was deallocated");
}
関心のあるすべてのオブジェクトのライフサイクルを単一のコンテナのライフサイクルに結び付けることができると仮定しました。そうしないと、ノーティファイアを関連するすべてのオブジェクトに関連付けることができます。
配列は、取得するまでに確実になくなっていますarrayDidDealloc
。