gpt4 book ai didi

iphone - Objective-C : swizzle object method after creation

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:50:23 26 4
gpt4 key购买 nike

我想在创建对象后调配对象方法。

例子:

@interface MyObj: NSObject
-(NSString*) foo;
-(NSString*) bar;
@end

@implementation MyObj
-(NSString*) foo {return @"foo";}
-(NSString*) bar {return @"bar";}
@end

void Swizzle(object, SEL source, SEL, dest);

...

MyObj* obj = [[[MyObj alloc] init] autorelease];

NSLog(@"%@", [obj foo]);
Swizzle(obj, @selector(foo), @selector(bar));
NSLog(@"%@", [obj foo]);

输出:

foo
bar

我看了很多 examples在创建对象之前调配。但是正如您所看到的,我想在创建对象后进行调配。

这是因为我想跟踪将要释放的对象(比如 NSThread)。我不想 swizzle NSObject dealloc 因为这似乎有点过分了。我宁愿只调配我试图跟踪的对象。

最佳答案

老实说,这似乎是避免使用 Instruments 的不明智尝试。如果是这样,正确答案是“只需使用 Instruments”。

但要真正回答这个问题:您不能对单个对象执行此操作。方法——甚至是实例方法——是按类定义的,而不是按对象定义的。在每个对象的基础上覆盖方法的唯一方法是动态创建对象类的子类,该子类覆盖您感兴趣的方法并 isa-swizzle 对象,以便它使用子类的查找表。 (这基本上就是 KVO 在幕后进行神奇通知的方式。)同样,这有点 hack,通常比它值得的麻烦多得多,所以在你这样做之前,我真的会三思(或三思) ) 关于这是否真的有必要。对于我能想到的几乎所有用例,都有一种更简洁的方法来实现相同的目标,而且不涉及运行时巫术。

关于iphone - Objective-C : swizzle object method after creation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9949288/

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