gpt4 book ai didi

objective-c - Swizzling 单个实例,而不是类

转载 作者:IT王子 更新时间:2023-10-29 08:14:41 25 4
gpt4 key购买 nike

我在 NSObject 上有一个类别,它应该有一些东西。当我在一个对象上调用它时,我想覆盖它的 dealloc 方法来做一些清理工作。

我想使用方法调配来做到这一点,但不知道如何做。我发现的唯一示例是关于如何替换整个类的方法实现(在我的例子中,它将覆盖所有 NSObjects 的 dealloc - 我不想这样做)。

我想覆盖特定 NSObject 实例的 dealloc 方法。

@interface NSObject(MyCategory)
-(void)test;
@end

@implementation NSObject(MyCategory)
-(void)newDealloc
{
// do some cleanup here
[self dealloc]; // call actual dealloc method
}
-(void)test
{
IMP orig=[self methodForSelector:@selector(dealloc)];
IMP repl=[self methodForSelector:@selector(newDealloc)];
if (...) // 'test' might be called several times, this replacement should happen only on the first call
{
method_exchangeImplementations(..., ...);
}
}
@end

最佳答案

你不能真正做到这一点,因为对象没有自己的方法表。只有类有方法表,如果你改变它们,它会影响那个类的每个对象。不过,有一种直接的解决方法:在运行时将对象的类更改为动态创建的子类。这种技术,也称为 isa-swizzling,被 Apple 用于实现自动 KVO。

这是一种强大的方法,它有其用途。但是对于您的情况,有一种使用关联对象的更简单的方法。基本上,您使用 objc_setAssociatedObject 将另一个对象关联到您的第一个对象,该对象在其 dealloc 中进行清理。您可以在 this blog post on Cocoa is my Girlfriend 中找到更多详细信息.

关于objective-c - Swizzling 单个实例,而不是类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9504341/

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