A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© foolishlovepig 中级黑马   /  2016-1-10 14:07  /  979 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


SEL就是方法名类型(可以理解为一种数据类型);

它将方法名转换为一种SEL数据类型,
格式:@selector (方法名)

例如:SEL s1;

s1 = @selector (test);

[p performSelector:s1];

有了方法地址,可不可以把方法地址直接作为参数传给其他的对象(类对象或者实力对象)进行使用;

1 个回复

倒序浏览
  1. #import "Dog.h"
  2. #import "Person.h"
  3. #import <Foundation/Foundation.h>

  4. int sum(int x, int y) {
  5.         return x + y;
  6. }
  7. int (*func3)(int, int);
  8. int main(int argc, const char * argv[]) {
  9.         @autoreleasepool {
  10.                 Person * p = [[Person alloc] init];
  11.                 Dog * dog = [[Dog alloc] init];

  12.                 SEL s1 = NSSelectorFromString(@"run"); //人的方法
  13.                 SEL s2 = NSSelectorFromString(@"eat"); //狗的方法
  14.                 IMP imp1 = [p methodForSelector:s1];   //<---使用p对象找到函数地址.
  15.                 IMP imp2 = [dog methodForSelector:s2];
  16.                 void (*func1)(id, SEL) = (void *)imp1; // <---这个才是函数指针
  17.                 void (*func2)(id, SEL) = (void *)imp2;
  18.                 func1(dog, s1); //即便是狗也能调用 人的方法...

  19.                 func2(p, s2); //参数是 id,SEL

  20.                 //
  21.                 func3 = sum;
  22.                 int result = func3(2, 3);
  23.                 printf("%d\n", result);
  24.         }
  25.         return 0;
  26. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马