概括
我正在尝试动态子类化对象以在 dealloc 之前进行一些清理。我向对象添加了一个子类,并添加了我自己的 dealloc 方法来进行清理,然后调用[super dealloc]
. 这适用于大多数情况,但是当 UIViewControllers 发生时我遇到了一些奇怪的事情。似乎在 dealloc 中没有进行一些清理,因为当 -hash 被发送到已释放的视图控制器时我遇到了崩溃。
当为新的视图控制器创建视图时会发生这种情况,并且它会在 UIViewController 的类方法中增长一些哈希集。它似乎是视图的视图控制器散列,因为它位于方法 +[UIViewController setViewController:forView:] 中。
如果我不将我自己的 dealloc 方法添加到动态子类中,一切都很好。即使我只调用[super dealloc]
我自己的 dealloc 版本,它也会以同样的方式崩溃。
有谁知道可能出了什么问题?除了调用之外,我还需要做其他事情[super dealloc]
以便它仍然执行它应该执行的所有操作吗?
编码
dealloc 方法如下所示:
- (void)deallocWithRemoveAllAssociatedBindings {
[[BindingManager sharedInstance] removeAllBindingsAssociatedWithObject:self];
[super dealloc];
}
我的动态调酒方法如下所示:
+ (void)createSubclassForObject:(id)object {
Class objectClass = object_getClass(object);
NSString *objectClassString = NSStringFromClass(objectClass);
NSString *subclassName = [NSString stringWithFormat:@"RemoveAllAssociatedBindings_%@", objectClassString];
Class subclass = objc_getClass([subclassName UTF8String]);
if (!subclass) {
subclass = objc_allocateClassPair(objectClass, [subclassName UTF8String], 0);
if (subclass) {
Method dealloc = class_getInstanceMethod(self, @selector(deallocWithRemoveAllAssociatedBindings));
class_addMethod(subclass, @selector(dealloc), method_getImplementation(dealloc), method_getTypeEncoding(dealloc));
[self addRemoveMethodToClass:subclass];
objc_registerClassPair(subclass);
}
}
if (!!subclass) {
object_setClass(object, subclass);
}
}
你可以在 github 上看到完整的代码:https ://github.com/drewag/property-bindings