SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址,找到方法地址就可以调用方法
方法的存储位置: 1. 每个类的方法列表都存储在类对象中 2. 每个方法都有一个与之对应的SEL类型的数据 3. 根据一个SEL数据就可以找到方法的地址,进而调用方法
每个方法内部都有个 SEL 类型的_cmd,代表当前方法 验证: - (void)text2 { NSString *str = NSStringFromSelector(_cmd); NSLog(@"text2-----%@",str); } 然后再main.m Person *p = [[Person alloc]init]; [p text2];
结果打印str的值为text2,说明了_cmd就是代表当前方法,代码表示为_cmd ==@selector(text2); 注意:在text2内部这样写会死循环,[self performSelector:_cmd]; ’ 加深理解: // 1.把text2包装成SEL类型的数据 // 2.根据SEL数据找到对应的方法地址 // 3.根据方法地址调用对应的方法 // [p text2];或者用下面的方法 [p performSelector:@selector(text2)];
// 有参数的话,可以用这两种方式 // [p text3:@"123"]; SEL s = @selector(text3:); [p performSelector:s withObject:@"123"];
// 只知道方法名字符串,这样用 NSString *name = @"text"; SEL s = NSSelectorFromString(name); [p performSelector:s];
综上,两种方法转换为SEL数据: SEL s = @selector(text3:); SEL s = NSSelectorFromString(name);
|