SEL是对方法的一个包装 将方法包装成一个SEL类型的数据,根据SEL类型的数据,寻找方法的地址 找到地址后就可以调用方法
{
_cmd:每个方法内部都有这样一个指令,类型是SEL,这表明_cmd是当前的方法
NSStringFromSelector(A selector):根据selector返回一个字符串(方法名字)
}
通过以上叙述,我们可以在方法中这样写
//
// SELTest.h
// OCStudy
//
// Created by LiuMingchuan on 15/9/25.
// Copyright © 2015年 LMC. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface SELTest : NSObject
- (void)test001:(NSString *)str;
@end
//
// SELTest.m
// OCStudy
//
// Created by LiuMingchuan on 15/9/25.
// Copyright © 2015年 LMC. All rights reserved.
//
#import "SELTest.h"
@implementation SELTest
- (void)test001:(NSString *)str {
NSLog(@"Function :%@ outPut:%@", NSStringFromSelector(_cmd),str);
}
@end
SELTest *sel = [[SELTest alloc]init];
[sel test001:@"这是输出内容"];
输出:
2015-09-25 23:58:41.406 OCStudy[4564:2058675] Function :test001: outPut:这是输出内容我们看到输出的正式方法的名字(注意后面的冒号)
如果我们知道方法的名字,同样我们可以做成一个SEL类型的数据
NSString *selStr = @"test001:";
SEL selTest = NSSelectorFromString(selStr);
[sel performSelector:selTest withObject:@"这是通过字符串生成SEL的调用"];
输出:
2015-09-26 00:16:58.261 OCStudy[4608:2130842] Function :test001: outPut:这是通过字符串生成SEL的调用问题:
上边的绿色部分会有警告
performSelector may cause a leak because
its selector is unknown
在ARC项目中使用
主要是警告信息,在非ARC项目中没有这个警告。如果是在某一处修改只需要加入下列代码:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[self.ticketTarget performSelector: self.ticketAction withObject: self];//此处是你调用函数的地方
#pragma clang diagnostic pop
#define SuppressPerformSelectorLeakWarning(Stuff) \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
Stuff; \
_Pragma("clang diagnostic pop") \
如果没有返回结果,可以直接按如下方式调用:
SuppressPerformSelectorLeakWarning(
[_target performSelector:_action withObject:self]
);
如果要返回结果,可以按如下方式调用:
id result;
SuppressPerformSelectorLeakWarning(
result = [_target performSelector:_action withObject:self]
);
SuppressPerformSelectorLeakWarning(
[sel performSelector:selTest withObject:@"这是通过字符串生成SEL的调用"]
);
输出:
2015-09-26 00:55:13.765 OCStudy[4677:2357874] Function :test001: outPut:这是通过字符串生成SEL的调用
本文介绍如何在Objective-C中使用SEL技术来包装方法并调用,包括方法内部SEL指令的理解、从字符串生成SEL数据进行方法调用,并解决ARC项目中的性能警告问题。
8429

被折叠的 条评论
为什么被折叠?



