为了理解IMP
,我写了一些测试代码,发现测试过程中存在问题。
我有一个惊喜
这是代码。
@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
时没有问题。但是当我运行多个IMP
时BAC_ACCESS
会崩溃,而且只有具有参数的函数才会发生。所以,为什么它可以与一个合作并与两个崩溃。
答案 0 :(得分:0)
当然,您遇到了崩溃,因为您需要路径id
,SEL
以及NSString *
。
更好地转换为实际函数原型,以便在调用错误时出现编译器错误,而不是使用直接IMP变量。
Apple应禁止()
的{{1}}运算符,并声明为IMP
。
但人们很少使用void *
进行直接方法调用,因此没有抱怨。