iOS-SEL的用法和讲解

原创 2017年01月03日 15:05:51

本文首发地址

1:什么是SEL:
可理解成@selector(),方法选择器。于是乎就可说成是C中的指针函数。而在oc里不能用指针函数,所有就只能搞一个@selector这来取了。
他的结果是SEL类型,用assgin修饰。去取方法的编号(函数地址)

2:使用
2.1 示例代码
SELView.h

/**SEL实现*/
#import <UIKit/UIKit.h>

@interface SELView : UIView

/**自定义的SEL*/
@property (nonatomic, assign) SEL  customMethod;
/**正常调用函数*/
-(void)printfString:(NSString *)msg;

/**SEL调用*/
-(void)testMethod;
/**SEL调用带参数*/
-(void)testMethod:(NSString *)msg;

-(void)runMethod;
@end

SELView.m

#import "SELView.h"

@implementation SELView

-(void)printfString:(NSString *)msg {
    NSLog(@"-----printfString%@",msg);
}

/**无参数函数*/
-(void)testMethod{
    NSLog(@"-----testMethod");
}
/**有参数函数*/
-(void)testMethod:(NSString *)msg {
    NSLog(@"-----(有参数函数)testMethod:%@",msg);
}


-(void)runMethod{
    if (_customMethod) {
        [self performSelector:_customMethod withObject:nil];
    }
}

2.2 调用详解

//实例化对象
SELView *views = [[SELView alloc] init];

2.2.1 正常调用的方式如下

[views printfString:@"1:自定义的打印功能"];

2.2.2 传入SEL方法调用
NOTICE:这里我们用的@selector方法一定要是当前SEL类中的函数,应为当前Class是一个isa指针,而这个@selector就是调用当前isa中方法,取其中的编号。

/**传入的方法*/
views.customMethod = @selector(testMethod);

这里的testMethod就是当前views中的方法。否则当前对象无target,就会有错!
2.2.3 执行Selector和传参

/**无参数函数*/
[views performSelector:@selector(testMethod)];
/**有参数函数*/
[views performSelector:@selector(testMethod:) withObject:@"传入参数"];

2.2.4 SEL和NSString装换

/**将一个字符串转换成SEL类型*/
//SEL s1 = NSSelectorFromString(@"customClick");
SEL s2 = @selector(customClick);
[self performSelector:s2];

NOTICE:这个时候会有一个提示performselectorm may cause a leak because its selector is unknow,在ARC模式下,运行时需要知道如何处理你正在调用的方法的返回值。这个返回值可以是任意值,如 void , int , char , NSString , id 等等。ARC通过头文件的函数定义来得到这些信息。所以平时我们用到的静态选择器就不会出现这个警告。因为在编译期间,这些信息都已经确定。
而使用 [someController performSelector: NSSelectorFromString(@”customClick”)]; 时ARC并不知道该方法的返回值是什么。最后搞的什么鬼都不认识了。如何处理 请各位看官看我的下一篇文章。如何解决。

如有问题可添加我的QQ:1290925041
还可添加QQ群:234812704(洲洲哥学院)
欢迎各位一块学习,提高逼格!
也可以添加洲洲哥的微信公众号

更多消息

更多信iOS开发信息 请以关注洲洲哥 的微信公众号,不定期有干货推送:

这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

IOS SEL (@selector) 原理及使用总结(一)

SEL 类成员方法的指针 可以理解 @selector()就是取类方法的编号,他的行为基本可以等同C语言的中函数指针,只不过C语言中,可以把函数名直接赋给一个函数指针,而Object-C的类不能直接...
  • fengsh998
  • fengsh998
  • 2013年02月26日 16:36
  • 88379

IOS 关于SEL的简单总结

SEL就是对方法的一种包装。包装的SEL类型数据它对应相应的方法地址,找到方法地址就可以调用方法 1.方法的存储位置 在内存中每个类的方法都存储在类对象中 每个方法都有一个与之对应的...
  • jiajiayouba
  • jiajiayouba
  • 2014年12月08日 11:12
  • 2258

【iOS开发】SEL和Selector 原理小结

一 、Selector(选择器)简介选择器是用来选择一个方法来为一个对象 执行的名称,或是在编译源代码时替换该名称的 唯一标识符的名称。一个选择器本身不做任何事情。它简单地识别了一种方法。唯一使选择器...
  • Hanrovey
  • Hanrovey
  • 2016年12月14日 18:27
  • 1463

iOS中SEL和IMP

我们有时在写iOS程序或者看一些框架代码时会看到SEL和IMP的方法,那这两个到底是什么呢? SEL:类成员方法的指针,但是不同于C语言的函数指针,函数指针直接保存了方法的地址,但SEL只是方法编号;...
  • Dafei_master
  • Dafei_master
  • 2017年05月03日 15:47
  • 357

selector 与NSString 转化

3 @implementation NSObject (NSObjectSelectorExtension)   4   5 - (id)perform_string:(NSString*)st...
  • yanxiaoqing
  • yanxiaoqing
  • 2012年07月19日 18:36
  • 4692

iOS @property探究(二): 深入理解

你要知道的@property都在这里转载请注明出处 http://www.jianshu.com/p/44d12884e24e上一篇文章iOS @property探究(一):基础详解介绍了@prope...
  • u014205968
  • u014205968
  • 2017年03月21日 16:13
  • 694

IOS SEL (@selector) 原理及使用总结(二)

SEL消息机制工作原理是什么  引用下面文章: 我们在之前有提到,一个类就像一个 C 结构.NSObject 声明了一个成员变量: isa. 由于 NSObject 是所有类的...
  • fengsh998
  • fengsh998
  • 2013年02月26日 16:43
  • 18727

IOS SEL (@selector) 原理及使用总结(二)

SEL消息机制工作原理是什么  引用下面文章: 我们在之前有提到,一个类就像一个 C 结构.NSObject 声明了一个成员变量: isa. 由于 NSObject 是所有类的...
  • fengsh998
  • fengsh998
  • 2013年02月26日 16:43
  • 18727

IOS SEL (@selector) 原理及使用总结(一)

SEL 类成员方法的指针 可以理解 @selector()就是取类方法的编号,他的行为基本可以等同C语言的中函数指针,只不过C语言中,可以把函数名直接赋给一个函数指针,而Object-C的类不能直接...
  • fengsh998
  • fengsh998
  • 2013年02月26日 16:36
  • 88379

iOS中的SEl和IMP到底是什么

SEL : 类成员方法的指针,但不同于C语言中的函数指针,函数指针直接保存了方法的地址,但SEL只是方法编号。 IMP:一个函数指针,保存了方法的地址 IMP和SEL关系 每一个继承于NSO...
  • dkq972958298
  • dkq972958298
  • 2017年04月10日 09:30
  • 674
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS-SEL的用法和讲解
举报原因:
原因补充:

(最多只允许输入30个字)