黑马程序员技术交流社区

标题: 分类 [打印本页]

作者: wdcew    时间: 2015-8-14 23:58
标题: 分类
1、使用类别的目的
1)对现有类进行扩展
比如,你可以扩展Cocoa touch框架中的类,你在类别中增加的方法会被子类所继承,而且在运行时跟其他的方法没有区别。
2)作为子类的替代手段: 不需要定义和使用一个子类,你可以通过类别直接向已有的类里增加方法
3)对类中的方法归类: 利用category把一个庞大的类划分为小块来分别进行开发,从而更好的对类中的方法进行更新和维护。  

2声明和实现一个类
@interface ClassName(CategoryName)
NewMethod; //在类别中添加方法
//不允许在类别中添加变量
@end
说明:
声明类别格式
1)新添加的方法必须写在 @interface 与@end之间
2)ClassName 现有类的类名(要为哪个类扩展方法)  
3)CategoryName 待声明的类别名称
4)NewMethod 新添加的方法  
列子如下:
@interface Fraction (MathOps)

- (Fraction *)add:(Fraction *)f;
- (Fraction *)mul:(Fraction *)f;
- (Fraction *)sub:(Fraction *)f;
- (Fraction *)div:(Fraction *)f;
- (Fraction *)invert:(Fraction *)f;

@end
注意:  
1)不允许在声明类别的时候定义变量  
在.m文件中,实现类别
@implementation ClassName(categoryName)
@end
@implementation Fraction (MathOps)
。。
@end

1、分类的使用注意事项  
1)分类只能增加方法, 不能增加成员变量、@property(可能编译不报错,但是运行有问题)
2)分类可以访问原来类中的成员变量
3)如果分类中有和类本身同名的方法,优先会调用分类中的同名方法;
4)如果多个分类中有同名的方法,执行哪个分类的方法,取决于编译的顺序,最后编译的那个分类中的方法会执行。  

延伸的使用(extend)
//延展的声明                           //分类的声明
@interface Student ()                @interface Student(Creation)
@end                                                 @end
我们可以通过延展定义类的私有方法。延展主要定义在.m文件中(方法二)。
在类的延伸当中,可以定义额外实例变量和属性来扩展类。
数据与方法仅仅提供给类本身。
有使用只有一个.h文件作为延伸(extend),需要申明方法,方法的实现部分在 相对应的类的.m中完成!!
数据与方法仅仅提供给类本身,
如何实现方法私有化,有以下三种种方法:


方法一:(缺点:文件中引入延展的头文件,那么在这个文件中定义的类的对象就可以直接调用在延展中定义所谓私有的方法  )

通过延展来实现方法的私有,延展的头文件独立(独立的.h文件)。这种方法不能实现真正的方法私有,当在别的文件中引入延展的头文件,那么在这个文件中定义的类的对象就可以直接调用在延展中定义所谓私有的方法  
// 对类的延展 - 隐藏方法 wrap的一种手段(非强制)  
.h文件
@interface SceneManager ()
+ (void) wrap;
@end
.m类的实现文件中  
@implementation SceneManager
+ (void) wrap {
    NSLog(@"method of wrap");
}
@end
调用  
[SceneManager wrap];
// 这里会抱一个警告:Class method of "+ wrap" not found
// 不过虽然是警告,不过运行是正常的,不过这么写在自我规范上不好,即使编译器没有做强制 限制,我们自己也要限制自己。
// 不然,延展方法就毫无意义可言。
通过界面创建延展:   
















第二种实现延展的方式是延展没有独立的头文件,在类的实现文件.m中声明和实现延展,这种方法可以很好的实现方法的私有,因为在OC中是不能引入.m的文件的(推荐使用这种方法。代码如下:  
@interface Fraction ()
-(void) reduce;
@end
//--@implementation(实现)部分----

@implementation Fraction: NSObject
@synthesize  numerator, denominator;

。。。(省略其他代码
-(void) reduce(约分的方法)
{
    int u = numerator;
    int v = denominator;
    int temp;
    if(u < v){
        temp=u;
        u=v;
        v=temp;
        
    }
    while(v !=0){
        temp=u%v;
        u=v;
        v=temp;
    }
    if (0 != u) {
    numerator /= u;
    denominator /= u;
    }
}
方法 reduce 只有类内部使用(私有方法),对象以及子类都无法使用与继承

第三种实现方法私有的方式是在.m文件中的,@implementation中直接实现在@interface中没有声明 的方法,这样也可以很好的实现方法的私有。  









欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2