Objective-C 碎碎念 6

本文为大地瓜原创,欢迎知识共享,转载请注明出处。
虽然你不注明出处我也没什么精力和你计较。
作者微信号:christgreenlaw


本节探讨SEL类型。

配合对象/类来检查对象/类是否实现了某个方法

SEL sel = @selector(setAge:);
Person *p = [Person new];
// 判断p对象中有没有实现-号开头的setAge:方法
BOOL flag = [p respondsToSelector:sel];
NSLog(@"flag = %i", flag);

// respondsToSelector注意点: 
//如果是通过对象来调用该方法,会判断该对象有没有实现-号开头的方法
//如果是通过类来调用该方法, 那么会判断该类有没有实现+号开头的方法
SEL sel1 = @selector(test);
flag = [p respondsToSelector:sel1];
NSLog(@"flag = %i", flag);

flag = [Person respondsToSelector:sel1];
NSLog(@"flag = %i", flag);

respondsToSelector说白了就是看receiver能不能响应某个方法。

配合对象/类来调用某一个SEL方法

SEL sel = @selector(demo);
Person *p = [Person new];
// 调用p对象中sel类型对应的方法
[p performSelector:sel];

SEL sel1 = @selector(signalWithNumber:);
// withObject: 需要传递的参数
// 注意: 如果通过performSelector调用有参数的方法, 那么参数必须是对象类型, 因为withObject只能传递一个对象
[p performSelector:sel1 withObject:@"13838383438"];

SEL sel2 = @selector(setAge:);
[p performSelector:sel2 withObject:@(5)];
NSLog(@"age = %i", p.age);

// 注意:performSelector最多只能传递2个参数
SEL sel3 = @selector(sendMessageWithNumber:andContent:);
[p performSelector:sel3 withObject:@"138383438" withObject:@"abcdefg"];

配合对象将SEL类型作为方法的形参

Car *c = [Car new];
SEL sel = @selector(run);

Person *p = [Person new];
[p makeObject:c andSel:sel];

Person中 makeObject: andSEL:的实现

- (void)makeObject:(id)obj andSel:(SEL)sel
{
    [obj performSelector:sel];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容