OC类的分类和类的加载过程

来源:互联网 发布:linux 内存信息 编辑:程序博客网 时间:2024/06/04 16:56

1.分类的使用
在开发过程中,如需要给某个类添加一些方法而不改变原来类,可以通过分类来实现,利用分类可以给原有类添加一些后来需要的一些功能,也可以达到共同开发一个类,实现项目合作。
分类的作用:再不改变原来类的基础上,可以为类增加一些方法,原来类可以是系统自带的类
分类的命名规则:可以随便命名,一般分类名要体现出分类的功能,这样让别人易懂。
例如:给类NSString添加一个计算字符串中阿拉伯数字个数的方法。
1.首先建立一个分类 
2.原类选择NSString
3.在分类中写所需方法
方法的声明:
#import <Foundation/Foundation.h>@interface NSString (NumberCount)// 所需添加的方法- (int)NumberCountOfNSString;@end
方法的实现:
#import "NSString+NumberCount.h"@implementation NSString (NumberCount)- (int)NumberCountOfNSString{    int count = 0; // 记录阿拉伯数字的个数    for (int i = 0;i <self.length ;i++)    {        //遍历字符串        unichar c = [self characterAtIndex:i];        if (c >='0' && c <= '9')        {            count++;        }    }    return count;}@end
main()函数:
int main(){    int c2 = [@"123qwer456dfsdfa23" NumberCountOfNSString];    NSLog(@"%d",c2);        return 0;}
分类使用注意:

1.分类只能增加方法,不能增加成员变量

2.分类方法实现中可以访问原来类中的声明的成员变量

3.分类可以重新实现原来类中的方法,但会覆盖掉原来的方法,会导致原来的方法没法在使用

4.方法调用的优先级:分类(最后编译的分类)--->原来类--->父类

2.类的加载过程

类加载的本质

1.当程序启动时,就会加载项目中所有的类和分类。而且加载后会调用每个类     和分类的+loa方法。只会调用一次

2.当第一次使用某个类时,就会调用当前类的+initialize方法

3.先加载父类,在加载子类(先调用父类的+load,在调用子类的+load方法)先初始化父类,再初始化子类(先调用父类的+initialize方法,再调用子类的+initialize方法)

创建一个Person类,在创建Student类继承Person类,在创建Student一个分类Student+Study,如:

父类Person方法如下:

#import "Person.h"@implementation Person+ (void)load{    NSLog(@"Person--load");}+(void)initialize{    NSLog(@"Person--initialize");}@end
子类和分类一样写

输出结果:

 Person--load Student--load 分类--load
可以看出,最先加载父类,其次加载子类,最后加载子类的分类。

当初始化父类对象时:

int main(){    Person *p = [[Person alloc] init];        return 0;}
输出结果;
 Person--load Student--load 分类--load Person--initialize
子类和子类分类没有初始化

当初始化子类时:

int main(){    Student *p = [[Student alloc] init];        return 0;}
输出结果:

 Person--load Student--load 分类--load Person--initialize 分类--initialize
父类先初始化,其次分类初始化







0 0
原创粉丝点击