-
Notifications
You must be signed in to change notification settings - Fork 112
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
为啥交换 class method 和交换 instance method 的实现有差异? #14
Comments
@whihail `@interface Base : NSObject
@interface A : Base
@interface B : Base |
多谢 |
原因在于 class_getInstanceMethod 和 class_getClassMethod 方法吧,当子类没有自己实现方法而是继承父类的时候,这俩方法拿到的是父类的 Method 对象。 而有趣的是当 class_addMethod 方法返回 NO 的时候,说明子类自己已经实现了方法,就不存在修改父类 IMP 的情况了。无需多此一举。 类也是对象,类方法和实例方法本质上是同样的。这种区分毫无必要。 PS:我的文章下面有评论引用了这个 issue,我觉得会误导人,所以过来评论了下。http://yulingtianxia.com/blog/2017/04/17/Objective-C-Method-Swizzling/ |
@yulingtianxia 实际上你和我说的是同个意思,而且我在上面的回复已经说明了,并没有区分必要。 |
“实际上 交换实例方法 的写法才是正确的,交换类方法是改漏了” |
issue里贴的是修改前的代码,其实你和我们说的都是同个意思。 |
@yulingtianxia execuse me? |
我的理解是 else 分支里两种写法都 OK,不存在 『实际上 交换实例方法 的写法才是正确的,交换类方法是改漏了。考虑到类继承关系,我们hook的方法有可能在不同子类和父类都有实现,method_exchangeImplementations 会直接修改修改到父类的IMP,多次swizzleInstanceMethod会乱。』这句话所描述的问题。 |
@yulingtianxia 你的理解错了,具体可以参考一下 NSObjectSafeTests.m 的测试用例。 |
看了下 NSObjectSafeTests.m 的两个 wrongSwizzleXXXMethod 方法,用的都是 method_exchangeImplementations。通过方法名字暗示实现是错的么? 所以想请教下下面这段话里为啥说交换类方法改漏了,交换实例方法才是正确的。(PS:交换实例方法用的是 class_replaceMethod ,NSObjectSafeTests.m 里用的写法是交换类方法的写法。)
顺便说下:
|
@yulingtianxia 不好意思,最近几个月挺忙,github逛得少,没来得及回复。
|
@whihail 我觉得我强调多少遍都没有用了,都不仔细看啊,那就这样吧。 |
@yulingtianxia 其实我和作者也强调多次了,你做事想问题有些偏激,没有耐心。 |
@whihail 好吧,就事论事,莫人身攻击。因为第三点的内容我纠正好几次了,但是都被忽略了。只能先这样了,可能理解不同吧。 |
为什么交换实例方法的时候需要
而交换类方法是只需要
看了许久,希望能得到帮助和理解
The text was updated successfully, but these errors were encountered: