gpt4 book ai didi

ios - method_exchangeImplementations 导致 EXC_BAD_ACCESS 错误

转载 作者:行者123 更新时间:2023-11-29 10:22:29 24 4
gpt4 key购买 nike

我试图测试 method_exchangeImplementations 在不同情况下的行为。当我尝试执行以下代码时,出现 EXC_BAD_ACCESS 错误。我不知道为什么程序以这个错误结束。这是我项目中的代码:

#import "ViewController.h"
#import <objc/runtime.h>


@interface Person : NSObject
@end

@implementation Person

- (void)say{
NSLog(@"Person");
}

@end

@interface Student : Person
@end

@implementation Student


- (NSString *)say {
return nil;
}

@end


@interface Doctor : Person

@end

@implementation Doctor


@end


@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
Student *stu =[Student new];
Doctor *dr = [Doctor new];
Person *person = [Person new];
Method studentMethod = class_getInstanceMethod([Student class], @selector(say));
Method doctorMethod = class_getInstanceMethod([Doctor class], @selector(say));


[stu say];
[dr say];
method_exchangeImplementations(studentMethod, doctorMethod);

[stu say];
[dr say];
[person say];
}


@end

有一件事我不得不提,那就是 Student 类中的 -say 方法。 say 方法的返回值为 NSString *。我不知道是否允许使用不同的返回类型编写覆盖方法。至少,编译器没有阻止我这样做,也许它仍然认为它是一个正常的覆盖。

谁能帮我解决这个错误?请解释为什么编译器也允许使用不同的返回类型进行覆盖。谢谢!

最佳答案

编译器(和 ARC)倾向于始终保留 swizzled 方法的返回值。当返回值不是 NSObjects 时,它通常会导致 EXC_BAD_ACCESS(因为它会将 retain 消息发送到非 objC 实例)。

如果您交换的方法之一需要返回一个非 objC 值(int、C 字符串等...甚至是 void),在方法调用时转换函数指针让编译器知道它不应该保留它(这避免了崩溃)。参见 https://blog.newrelic.com/2014/04/16/right-way-to-swizzle/ 的第二个脚注了解更多信息。

我希望这会有所帮助,我花了好几天(和几夜)才找到这个救了我一命的意想不到的脚注!

关于ios - method_exchangeImplementations 导致 EXC_BAD_ACCESS 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34270367/

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