基础知识(分类)
分类(categroy)
分类的作用:
在不改变原来类模型的基础上,给某个类扩充一些方法。( 不修改原来代码)
分类格式:
声明:@interface 类名 (分类名称)
一个类可以拥有很多分类,在分类名称中区别。
@end
实现:@implementation 类名 (分类名称)
@end
把不同功能的方法 ,写到不同的分类里面,一个分类写一中功能。
分类名称一般以模块命名,不是以作者命名。
分类的使用注意:
1,分类只能增加方法,不能扩充成员变量。
2,分类方法的实现里面可以访问原来声明的成员变量。
3,分类可以重新实现原来类中的方法,但是会覆盖原来的方法,导致原来的方法失效,原来方法无法使用。
4,分类的优先级:调用方法先去分类中找,然后去原来的类中找,没有再去父类中找。一级一级往上找。
5,最后参与编译的分类优先,看编译的顺序,最后编译的文件会覆盖前面编译文件。
分类的应用:(用在系统自带的类上面)
给系统自带的NSString 添加一个类方法:
计算某个字符串中阿拉伯数字的个数?
一般把分类的作用当做分类的名称
题目意思 @“agfdsfsdf123344566sfsdf" 计算数字的个数
要求:给NSString增加一个类方法。
@interface NSString(number)
+ (int)numberCountOfSting:(NSString *) str;
@implementation NSString(number)
+ (int)numberCountOfString:(NSString *) str
int count = 0;
for(int i = 0;i <str.length;i++)
{
uni char c = [str characterAtTndex: i];
if(c >= "0" && c <= "9")
{
count++;
}
}
retrun count; 在类方法中调用对象方法:return [str numberCount]; 一个方法解决两个方法。
}
int main()
{
int count = [NSString numberCountOfSting:@"afsfsfsdf131313sfsf"]
NSLog(@“%d.count”);
}
同样的题目,给NSString增加一个对象方法。
声明:- (int) numberCount; 对象方法不屑谁的,他自己的,后边也没有谁的字符串。
实现:
- (int)numberCount
{
int count = 0;
for(int i = 0; i <self.length;i++)
{
unichar c = [self characterAtTndex:i];
if (c>="0" &&c<="9")
{
count++;
}
return count;
}
}
int main()
{
int count = [@"sfsfsfs1313f13s1g3ssf",numberCount];
NSLog(@"%d\n",count);
}
类的深入研究 (类也是一个对象)
类的本质也是一个对象是class的对象
一个类在内存中,只有一块储存空间,这块储存空间称之为类对象。
class类型对象 创建对应类型的另一种 类对象,利用类对象创建出这个类。 类与类对象是等价的。
获取类对象的两种方式:
类方法:class c = [person class]l
对象方法: Person *p = [Person new]
class c2 = [p class]
拿到类对象有什么作用:
[p class] 获取到了内存中的类对象,有了类对象就能调用类方法。[c class];
类对象的使用:
每次创建对象首先都会把类对象创建好,加载内存,在利用类对象创建某一个类型的对象。
Person *p = [[Person alloc] init];
class c = [p class];
利用Person类型,对象p的class方法,能获取我们这个类对象
指针c 就是获取的内存中的类对象。
还可以这样创建对象:
Person *p2 =[(c new) init] =[(person new) init];
类的加载过程:
当程序已启动是会把所有的类搞进来加载一次,先加载父类在加载子类。
怎样验证是否加载了:
只要加载了这个类,就会调用类的一个 + Load方法,是个类方法,比较深层的一个方法。
只要这个类加载完毕后,系统会自动调用 +Load方法,而且类只会被加载一次。
+ (void)load
{
NSLog(@"我被调用了");
}
main函数虽然没有用到这个类,但类的有些东西还是会被加载。做一个简单的加载。
我想知道你有没有使用者个类,用+Load方法,因为只要在调用这个类,就会先加载,只要加载系统就会自动调用+Load方法 监听这个类的加载过程。
比如:
int main()
{
[[student alloc] init];
}
调用student 这个类时 会进一步的加载,加载完了,会调用另一个方法叫initlalize方法 。
+(void)initlalize
{
Nsl(@"student --initlalize");
}
当程序一启动时,就会加载一次项目中所有的类和分类,这个类加载完毕后就会调用+Load方法。只会加载一次。
当第一次使用这个类的时候,就会调用一次initlalize方法,而且,不管你是load还是initlalize都是先搞父类在到子类。
initlalize用到这个类调用的,用不到不调用。
分类也要加载 + load方法 不用也不用加载。
+initlalize方法会选择调用分类,不调用本类的+initlalize.如果分类没有 ,就去本类中找,本类中在没有去父类中找。
层层往上。
initlalize是初始化的意思。
重写这个类的initialize方法, 在+(void)initialize里面写上我们第一次使用类时想做的事情。利用这个方法可以监听这个类在什么时候可以被使用,这就是所谓的监听。
类第一次调用+initialize方法,监听类的初始化过程,知道类在什么时候被使用。