目标C:创建后的Swizzle对象方法 [英] Objective C: swizzle object method after creation

查看:38
本文介绍了目标C:创建后的Swizzle对象方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在创建对象之后,我想梳理对象方法.

I would like to swizzle an object method after the object has been created.

示例:

@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

在创建对象之前,我查看了很多示例.但是,正如您所看到的,创建对象后,我想陷入混乱.

I have looked at lots of examples of swizzling before an object is created. However as you can see I want to swizzle after an object is created.

这是因为我要跟踪要释放的对象(如NSThread).我不想麻烦NSObject dealloc,因为这似乎太过分了.我宁愿仅使要跟踪的对象模糊不清.

This is because I want to track objects that are going to release (like NSThread). I don't want to swizzle NSObject dealloc because that seems overkill. I would rather swizzle only the objects I am trying to track.

推荐答案

我最终得到的解决方案是使用objc_setAssociatedObject(thread,key,object,OBJC_ASSOCIATION_RETAIN_NONATOMIC);

The solution I ended up with was to use objc_setAssociatedObject(thread, key, object, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

这样,我可以检测何时释放线程并进行所需的清理.

That way I could detect when the thread was being released and do the cleanup I needed.

这篇关于目标C:创建后的Swizzle对象方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆