黑马程序员一分类,类的本质,description,SEL

来源:互联网 发布:h5穿上军装源码 编辑:程序博客网 时间:2024/06/04 18:09

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------



一.分类 Category 类别,类目

可以给某一个类拓充一些方法,不修改原来类的代码


//声明

@interface类名(分类名称)


@end


//实现


@implementation类名(分类名称)


@end


1.分类的好处

不同功能的方法写在不同的分类,有利于团队开发


2.分类的作用

可以在不改变原来类内容的基础上,可以为类增加一些方法


3.使用注意

只可以增加方法,不能增加成员变量.

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

分类的优先级最高,优先去分类中查找,如果没有去原来的类中找.分类可以重新实现原来类中的方法.若重新写原来类中的方法会覆盖原来的方法,会试原来方法失效,没办法再使用

方法调用优先级:分类->原来类->父类


如果两个分类实现同一个方法,实现最后编译那个分类中的方法.




给系统自带的方法添加一个类方法:计算输入字符串中含数字的个数


<span style="font-size:14px;">#import "NSString+Number.h"@implementation NSString (Number)+ (int)numberCountOfString:(NSString *)str{//    int count = 0;//    for (int i = 0 ; i < str.length ; i++ )//    {//        unichar c = [str characterAtIndx : i];//获取这个字符串某个位置的字符//        if (c >= '0' && c <= '9')//        {//            count++;//        }//    }//    return count;    return [str numberCount];}//int count = [NSString numberCountOfString:@"iowejfjfpwer93438r54"];</span><span style="font-size:12px;"></span>


给系统自带方法添加一个对象方法:


- (int)numberCount{    for(int i = 0 ; i < self.length ; i++)    {        unichar c = [self characterAtIndx:i];        if( c >= '0' && c <= '9')        {            count++;        }    }}//[@"idoueiwoeur904r903" numberCount];@end


二.类的本质

利用Person这个类创建了两个Person类型的实例对象

类本身也是一个对象,是个Class类型的对象,简称类对象


获取类对象 每个类对象都相同

Class c = [p calss];

Class c2 = [p2 calss];

Class c3 = [Person calss];

上述三个是相同的具有相同内存地址



当程序启动的时候,就会加载一次项目中所有类,类加载完毕后就会调用+load方法,只会调用一次

当程序第一次使用这个类,就会调用当前类的initialize方法(进行初始化)

先加载原始类,再加载分类

先加载父类,再加载子类(先调用父类的+load方法,再调用子类的+load方法)

先初始化父类,再初始化子类(先调用父类的+initialize方法,再调用子类的+initialize方法)



三.description

NSLog执行前调用-description这个对象方法决定了实例对象的输出结果,(+description返回值(NSString*)输出决定类对象的输出结果)

可以重写description这个方法.

不要在description中调用self会引发死循环


四.SEL

SEL只能转成字符串打印(对方法的包装成SEL类型的数据,再根据SEL数据找方法地址,来调用这个方法)耗性能

调用方法

[p test2];

[p performSelector:@seldctor(test2)];


[p test3:@"123"];

[p performSelector:@seldctor(test3:)withObject:@"123"];


把一个字符串转成SEL类型数据

把方法转成字符串

SEL s = NSSeleectorFromString(name);

[p performSelector:s]


每个方法内部都有一个SEL _cmd代表着当前方法


------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
0 0