将来跳槽用

重学iOS——8.类的加载过程与SEL类型的使用

2017-11-03  本文已影响44人  Peak_One
类的加载过程知识体系:

【掌握】+load方法
【掌握】+initialize方法
1.+load方法

在程序启动的时候会加载所有的类和分类,并调用所有类和分类的+load方法(只会调用一次)
先加载父类,再加载子类;也就是先调用父类的+load,再调用子类的+load
先加载元原始类,再加载分类
不管程序运行过程有没有用到这个类,都会调用+load加载

@implementation Person

+ (void)load
{
    NSLog(@"%s", __func__);
}
@end

@implementation Student : Person

+ (void)load
{
    NSLog(@"%s", __func__);
}
@end

输出结果:
+[Person load]
+[Student load]
2.+initialize

在第一次使用某个类时(比如创建对象等),只会调用一次+initialize方法
一个类只会调用一次+initialize方法,先调用父类的,再调用子类的

@implementation Person
+ (void)initialize
{
    NSLog(@"%s", __func__);
}
@end

@implementation Student : Person
+ (void)initialize
{
    NSLog(@"%s", __func__);
}
@end
int main(int argc, const char * argv[]) {
    Student *stu = [Student new];
    return 0;
}
输出结果:
+[Person initialize]
+[Student initialize]
SEL类型的使用:

SEL类型知识体系:

  1. 【理解】什么是SEL类型
  2. 【掌握】SEL使用
  3. 【理解】OC方法查找顺序

1.什么是SEL类型

Dog *dog=[[Dog alloc] init];
[dog eat];

sel.png

2.SEL使用

    BOOL flag;
    // [类 respondsToSelector]用于判断是否包含某个类方法
    flag = [Person respondsToSelector:@selector(objectFun)]; //NO
    flag = [Person respondsToSelector:@selector(classFun)]; //YES

    Person *obj = [[Person alloc] init];

    // [对象 respondsToSelector]用于判断是否包含某个对象方法
    flag = [obj respondsToSelector:@selector(objectFun)]; //YES
    flag = [obj respondsToSelector:@selector(classFun)]; //NO

    // [类名 instancesRespondToSelector]用于判断是否包含某个对象方法
    // instancesRespondToSelectorr只能写在类名后面, 等价于 [对象 respondsToSelector]
    flag = [Person instancesRespondToSelector:@selector(objectFun)]; //YES
    flag = [Person instancesRespondToSelector:@selector(classFun)]; //NO

    Person *p = [Person new];
    SEL s1 = @selector(objectFun);
    [p performSelector:s1];

    SEL s2 = @selector(objectFun:);
    [p performSelector:s2 withObject:@"lnj"];

    SEL s3 = @selector(objectFun:value2:);
    [p performSelector:s3 withObject:@"lnj" withObject:@"lmj"];

    SEL s4 = @selector(classFun);
    [Person performSelector:s4];

    SEL s5 = @selector(classFun:);
    [Person performSelector:s5 withObject:@"lnj"];

    SEL s6 = @selector(classFun:value2:);
    [Person performSelector:s6 withObject:@"lnj" withObject:@"lmj"];

@implementation Person

- (void)makeObject:(id) obj performSelector:(SEL) selector
{
    [obj performSelector:selector];
}
@end

int main(int argc, const char * argv[]) {

    Person *p = [Person new];
    SEL s1 = @selector(eat);
    Dog *d = [Dog new];
    [p makeObject:d performSelector:s1];

    return 0;
}


3.OC方法查找顺序

sldxldxydx.png

欢迎关注我的个人微信公众号,免费送计算机各种最新视频资源!你想象不到的精彩!


0.jpg
上一篇 下一篇

猜你喜欢

热点阅读