IMP如何在iOS中运行

时间:2017-10-25 11:59:48

标签: objective-c

为了理解IMP,我写了一些测试代码,发现测试过程中存在问题。

enter image description here

我有一个惊喜

enter image description here

enter image description here

这是代码。

@interface Test : NSObject

@property (nonatomic, copy) NSString *name;

@end

@implementation Test

- (NSString *)description{
    return [[super description] stringByAppendingString:self.name];
}

- (void)dealloc{
    NSLog(@"Test dealloc %@",self);
}

- (void)test:(NSString *)str{
    NSLog(@"- (void)test  %@",str);
}

+ (void)test:(NSString *)str{
    NSLog(@"+ (void)test  %@",str);
}

- (void)test{
    NSLog(@"- (void)test");
}

+ (void)test{
    NSLog(@"+ (void)test");
}

@end

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
//    IMP imp = [[Test new] methodForSelector:@selector(test:)];
//    NSLog(@"%p",imp);
//    IMP imp1 = [Test instanceMethodForSelector:@selector(test)];
    IMP imp2 = [Test methodForSelector:@selector(test:)];
//    NSLog(@"%p",imp2);
    imp2();
    NSLog(@"%p",imp2);
//    imp2 = [Test methodForSelector:@selector(test)];
//    imp2();
//    imp();
//    imp = [[Test new] methodForSelector:@selector(test:)];
//    NSLog(@"%p",imp);
//    imp();
//    imp1();
//    imp1();
//    imp2();
//    imp2();
//    void (*func)(id,SEL,NSString *) = (void *)imp;
//    func([Test class],@selector(test:),@"");
//    void (*func1)(id,SEL,NSString *) = (void *)imp1;
//    func1([Test class],@selector(test:),@"ha");
//    void (*func2)(id,SEL,NSString *) = (void *)imp2;
//    func2([Test class],@selector(test:),@"haha");
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

当我运行单个IMP时没有问题。但是当我运行多个IMPBAC_ACCESS会崩溃,而且只有具有参数的函数才会发生。所以,为什么它可以与一个合作并与两个崩溃。

1 个答案:

答案 0 :(得分:0)

当然,您遇到了崩溃,因为您需要路径idSEL以及NSString *。 更好地转换为实际函数原型,以便在调用错误时出现编译器错误,而不是使用直接IMP变量。 Apple应禁止()的{​​{1}}运算符,并声明为IMP。 但人们很少使用void *进行直接方法调用,因此没有抱怨。