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
父类先初始化,其次分类初始化