c语言中int sel是什么意思,SEL的理解
為什么要用 SEL
主要是 API 要求的,其它情況另定
Summary
可以理解 @selector() 就是取類方法的編號(hào),
它的行為基本可以等同 C語(yǔ)言 中的函數(shù)指針,
只不過(guò) C 語(yǔ)言 中,可以把函數(shù)名直接賦給一個(gè)函數(shù)指針,
而 Object-C 的類不能直接應(yīng)用函數(shù)指針,
這樣只能做一個(gè) @selector 語(yǔ)法來(lái)取.
每個(gè) SEL 類型數(shù)據(jù)都是一個(gè)方法。
SEL 就是對(duì)方法的一種包裝。
包裝的 SEL 類型數(shù)據(jù)它對(duì)應(yīng)相應(yīng)的方法地址,
找到方法地址就可以調(diào)用方法。
在內(nèi)存中每個(gè)類的方法都存儲(chǔ)在類對(duì)象中,
每個(gè)方法都有一個(gè)與之對(duì)應(yīng)的 SEL 類型的數(shù)據(jù),
根據(jù)一個(gè) SEL 數(shù)據(jù)就可以找到對(duì)應(yīng)的方法地址,
進(jìn)而調(diào)用方法。
Demo
#import "ViewController.h"
#define SuppressPerformSelectorLeakWarning(Stuff) \
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
Stuff; \
_Pragma("clang diagnostic pop") \
} while (0)
@interface ViewController ()
@end
@interface Person : NSObject
- (void)test;
- (void)test:(NSString *)string;
@end
@implementation Person
- (void)test {
NSLog(@"___test___");
}
- (void)test:(NSString *)string {
NSLog(@"___test___%@", string);
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
Person *p = [Person new];
// 手動(dòng)把 test 方法包裝成 SEL 類型
SEL s1 = @selector(test);
SEL s2 = @selector(test:);
// 響應(yīng)方法
SuppressPerformSelectorLeakWarning([p performSelector:s1]);
SuppressPerformSelectorLeakWarning([p performSelector:s2 withObject:@"參數(shù)"]);
SEL selector1 = NSSelectorFromString(@"test");
((void (*)(id, SEL))[p methodForSelector:selector1])(p, selector1);
}
@end
我的理解
Person *p = [Person new];
// 第一步,就是用 SEL 定義一個(gè)對(duì)象,這個(gè)對(duì)象用 @selector 的方式擁有了 p 的(test)方法
SEL s1 = @selector(test);
// 第二步,執(zhí)行這個(gè) s1 對(duì)象,就是執(zhí)行這個(gè)方法
[p performSelector:s1]
【原創(chuàng):iOS第九層】
總結(jié)
以上是生活随笔為你收集整理的c语言中int sel是什么意思,SEL的理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 24考研数学复习方法、全年规划
- 下一篇: IAP实验笔记