-[NSObject dealloc]
メソッドをスウィズすることによってオブジェクトが割り当て解除されたときに呼び出されるコードを記述しようとしました。私はこれが悪い考えであり、追求していないことを理解しています。(これを指摘するのは控えてください)しかし、その途中で、フリーダイヤルのNSDictionaryやNSStringなどのクラスは、CFDictionary CFStringは最終リリース時に-dealloc
を呼び出しません。フリーダイヤルのクラスは、コア・ファウンデーションの対応者とブリッジされて最終リリース時に-deallocを呼び出さないのはなぜですか?
このコードは、この現象を示しています。
上記のテストで- (void)loggedDealloc {
NSLog(@"Deallocation of %@", self.class);
[self loggedDealloc];
}
- (void)testDeallocSwizzleOnTestObject {
Method deallocMethod = class_getInstanceMethod([TestObject class], NSSelectorFromString(@"dealloc"));
Method loggedDeallocMethod = class_getInstanceMethod([self class], @selector(loggedDealloc));
method_exchangeImplementations(deallocMethod, loggedDeallocMethod);
TestObject * testObject = [[TestObject alloc] init];
testObject = nil; // calls release under ARC
method_exchangeImplementations(deallocMethod, loggedDeallocMethod);
}
- (void)testDeallocSwizzleOnNSDictionary {
Method deallocMethod = class_getInstanceMethod([NSDictionary class], NSSelectorFromString(@"dealloc"));
Method loggedDeallocMethod = class_getInstanceMethod([self class], @selector(loggedDealloc));
method_exchangeImplementations(deallocMethod, loggedDeallocMethod);
NSDictionary * dictionary = [[NSDictionary alloc] init];
dictionary = nil; // calls release under ARC
method_exchangeImplementations(deallocMethod, loggedDeallocMethod);
}
- (void)testDeallocSwizzleOnNSString {
Method deallocMethod = class_getInstanceMethod([NSString class], NSSelectorFromString(@"dealloc"));
Method loggedDeallocMethod = class_getInstanceMethod([self class], @selector(loggedDealloc));
method_exchangeImplementations(deallocMethod, loggedDeallocMethod);
NSDictionary * dictionary = [[NSDictionary alloc] init];
dictionary = nil; // calls release under ARC
method_exchangeImplementations(deallocMethod, loggedDeallocMethod);
}
、TestObjectの唯一のスウィズリングは、解除のロギングが発生する原因となります。 NSDictionaryとNSStringの比較は効果がありません。
私はフリーダイヤルブリッジ・クラスは、このようにメモリがCore Foundationので割り当てが解除され、-dealloc
への呼び出しが全く発生せず、代わりに[super release]
を呼び出すCFReleaseを実行するために-release
を実装しているため、これがあると思います。
これは誰でも確認できますが、それはどこに文書化されていますか?もしそうなら、これらの無料フリーダイヤルクラスの割り当て解除にカスタムコードを挿入する方法はありますか?