首页 > 代码库 > 分类和协议

分类和协议

1.分类

  • 分类的概念
    分类是objective-c特有的一种属性,其他编程语言没有类似的模块。分类是为了给现有的类基础上增加某些方法,而不通过继承的方式,这种方法只能给类增加方法,不能增加成员变量,而且不会对原有的类产生影响。分类是类的补充和扩展,本质上是类的一部分,把一个类分成若干部分,每个部分就是分类。
  • 分类的语法
    和类的定义基本一样,只是在类名后面加一对括号及名字
    * 文件中的语法:@interface 主类类名(分类类名)
    * 文件名通常为:主类名+分类名
    * 调用方法时,只需要向主类引用放送消息即可
  • 分类的性质
    * 分类不但可以给自定义的类添加功能,还可以给不知道源代码的类添加功能。比如NSString添加一个具体网络访问功能(访问服务器)
    * 在分类中,不可以定义实例变量,也不可以定义属性,可以访问对象的属性。
    * 在运行时,分类中的方法与类原有的方法并无区别,其代码可以访问包括私有类成员变量在内的所有成员变量。
    * 若分类声明了与类中原有方法同名的函数,则分类中的方法会被调用。因此分类不仅可以增加类的方法,也可以代替原有的方法。这个特性可以用于修正原有代码中的错误,更可以从根本上改变程序中原有类的行为。若两个分类中的方法同名,则被调用的方法是不可预测的。
    * 通常来讲,分类是定义在.h文件中,但也可以定义.m文件中,此时分类的方法就变成私有方法。
    * 使用分类时,包含分类定义的头文件即可

2.协议

  • 协议的概念
    协议有点类似于C++里面的虚类以及Java里面的接口,但是协议不能定义变量,只能定义函数。协议是定义一个规则,要求实现该协议的子类实现协议中定义的规则,其中有些规则是可选的。
  • 协议的语法
    定义一个协议:
        @protocol协议名
        @required声明必须遵守的属性和方法
        @optional声明可选的属性和方法
    默认@required
    一个类遵守(使用)一个协议:
        @interface 类名(分类名):父类名 <协议名>
  • 协议的性质
    一个类可以同时遵守多个协议,协议之间用""号分开多个协议时,使用类似<protocol1,protocol2>这样的形式

3.示例

  • 协议文件
    //
    //  Animal.h
    //  CategoryProtocol
    //
    //  Created by God Lin on 14-11-26.
    //  Copyright (c) 2014年 hust. All rights reserved.
    //
    
    #ifndef CategoryProtocol_Animal_h
    #define CategoryProtocol_Animal_h
    
    // 定义协议
    @protocol Animal <NSObject>
    
    // default is required
    @required
    -(void)showName;
    
    @optional
    -(void)showOptional;
    @end
    
    
    #endif
    

  • 分类定义文件
    //
    //  Cat+speak.h
    //  CategoryProtocol
    //
    //  Created by God Lin on 14-11-26.
    //  Copyright (c) 2014年 hust. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import "Cat.h"
    
    // 定义分类,注意语法,且只能写方法
    @interface Cat (speak)
    
    -(void)speak;
    
    @end
    

  • 分类实现文件
    //
    //  Cat+speak.m
    //  CategoryProtocol
    //
    //  Created by God Lin on 14-11-26.
    //  Copyright (c) 2014年 hust. All rights reserved.
    //
    
    #import "Cat+speak.h"
    
    // 实现分类,能直接访问类属性
    @implementation Cat (speak)
    
    -(void)speak
    {
        NSLog(@"%@ : 喵喵", name);
    }
    @end
    
    

  • 示例类的定义
    //
    //  Cat.h
    //  CategoryProtocol
    //
    //  Created by God Lin on 14-11-26.
    //  Copyright (c) 2014年 hust. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import "Animal.h"
    
    // 类实现协议
    @interface Cat : NSObject <Animal>
    {
        NSString*   name;
    }
    
    @property NSString* name;
    
    -(void)showName;
    
    @end
    

  • 示例类的实现
    //
    //  Cat.m
    //  CategoryProtocol
    //
    //  Created by God Lin on 14-11-26.
    //  Copyright (c) 2014年 hust. All rights reserved.
    //
    
    #import "Cat.h"
    
    @implementation Cat
    
    @synthesize name;
    
    -(void)showName
    {
        NSLog(@"%@", name);
    }
    @end
    

  • main文件
    //
    //  main.m
    //  CategoryProtocol
    //
    //  Created by God Lin on 14-11-26.
    //  Copyright (c) 2014年 hust. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import "Cat+speak.h"
    
    int main(int argc, const char * argv[])
    {
        @autoreleasepool
        {
            Cat* cat = [[Cat alloc] init];
            
            [cat setName:@"HelloKity"];
            [cat showName];
            [cat speak];
            
        }
        return 0;
    }
    

  • 输出结果
    2014-11-26 22:32:45.488 CategoryProtocol[1741:303] HelloKity
    2014-11-26 22:32:45.490 CategoryProtocol[1741:303] HelloKity : 喵喵

分类和协议