码迷,mamicode.com
首页 > 其他好文 > 详细

Objective-C - SEL (@selector) 原理及本质

时间:2015-04-20 11:18:42      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:objective   selector   c语言   函数指针   

SEL (@selector) 原理及本质

/*
 1.SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址。找到方法地址就可以调用方法

2.@selector()就是取类方法的编号,等同C语言的中函数指针,只不过C语言中,可以把函数名直接赋给一个函数指针,而Object-C的类不能直接应用函数指针,这样只能做一个@selector语法来取.
它的结果是一个SEL类型。这个类型本质是类方法的编号(函数地址)


3.其实消息就是SEL
 */

#import <Foundation/Foundation.h>
#import "Person.h"

int main()
{
    Person *p = [[Person alloc] init];

    [p test2];

    NSString *name = @"test2";

    SEL s = NSSelectorFromString(name);

    [p performSelector:s];


    // 间接调用test2方法
    //[p performSelector:@selector(test2)];

    //[p test3:@"123"];


    SEL s = @selector(test3:);

    [p performSelector:s withObject:@"456"];

    [p test2];

    // 1.把test2包装成SEL类型的数据
    // 2.根据SEL数据找到对应的方法地址
    // 3.根据方法地址调用对应的方法
    return 0;
}
@interface Person : NSObject

+ (void)test;

- (void)test2;


- (void)test3:(NSString *)abc;

@end
@implementation Person
+ (void)test
{
    NSLog(@"test-----");
}

- (void)test2
{
    // _cmd代表着当前方法

    NSString *str = NSStringFromSelector(_cmd);

    // 会引发死循环
    // [self performSelector:_cmd];

    NSLog(@"调用了test2方法-----%@", str);
}

- (void)test3:(NSString *)abc
{
    NSLog(@"test3-----%@", abc);
}
@end

Objective-C - SEL (@selector) 原理及本质

标签:objective   selector   c语言   函数指针   

原文地址:http://blog.csdn.net/wangzi11322/article/details/45146459

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!