gpt4 book ai didi

objective-c - 为什么与 Core Foundation 对应的免费桥接类在最终发布时不调用 -dealloc?

转载 作者:可可西里 更新时间:2023-11-01 05:47:17 28 4
gpt4 key购买 nike

我试图编写一些代码,当任何对象通过调配 -[NSObject dealloc] 方法被释放时将被调用。我知道这是一个坏主意并且不会去追求它(所以请不要指出这一点),但在此过程中我发现像 NSDictionary 和 NSString 这样的类是免费的,可以与 CFDictionary 这样的核心基础对应物桥接和 CFString 在最终发布时不调用 -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 的 swizzling 会导致发生释放记录。 NSDictionary 和 NSString 的调配没有任何效果。

我怀疑这是因为免费桥接类实现了 -release 来执行 CFRelease 而不是调用 [super release],因此内存被 Core 释放根本没有调用 -dealloc

任何人都可以确认是这种情况并且在任何地方都有记录吗?如果是这样,是否有任何方法可以将自定义代码注入(inject)到这些免费桥接类的释放中?

最佳答案

(嘿。去过那里。完成了。:)

dealloc 的调用只保证对各种类的子类。有许多类——主要是各种 CF/NS 桥接类——永远不会调用 dealloc,因为永远不需要这样做 [内部实现细节]。

做你想做的事,将所需的类子类化,将原始类的实例封装为后备存储,然后覆盖原始方法(每个类集群类都有一个非常小的集合原始方法——我认为 NSString 具有所有 2 种方法),然后覆盖该新类上的内存管理方法。因为它是一个子类,所以您在现有类中看到的“短路”将不再起作用。

关于objective-c - 为什么与 Core Foundation 对应的免费桥接类在最终发布时不调用 -dealloc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8827937/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com