设为首页 加入收藏

TOP

OC教程3-类目延展协议
2015-07-16 12:04:21 来源: 作者: 【 】 浏览:83
Tags:教程 延展 协议

OC3-语言特性

本章主要讲解OC语言特性

  1. 类目(Category)
  2. 延展(Extension)
  3. 协议(Protocol)

    1,类目

    OC语言中的类目机制只有一个作用:为任何一个类添加方法

    现在我们创建一个Student类

    @interface Student : NSObject
    
    @property(nonatomic,strong)NSString * name;
    
    @end
    
    @implementation
    
    @end
    

    如果想为Student类添加一个方法,现在有两种方法

    1. 直接修改Student类的源码,声明一个方法并实现。
    2. 使用类目。

      在无法获取类的源码且需要给一个类添加方法的情况下,类目的作用就非常重要了。

      创建类目的语法也非常简单,代码如下

      @interface Student (Test)
      
      -(void)test;
      
      @end
      
      @implementation Student (Test)
      
      -(void)test
      {
          NSLog(@"这里是Student类目的test方法");
      }
      @end
      

      声明和实现的关键字都和之前一样。

      不同的是,声明时候不需要指定父类,而是直接写要添加方法的类的名字,但后面一定要加一个括号,且括号里面写上类目名字。一个类可以有多个类目。

      有了这个类目之后,虽然Student类的源码中没有test方法,但仍然可以正常用Student对象去调用这个方法。

      Student * s = [[Student alloc] init];
      [s test];
      

      2,延展

      延展可以看作是一种匿名的类目,类有时需要一些只为自己所见,所用的私有方法这种私有方法可以通过延展的方式来声明。

      比如上文中的Student类有一个作弊的方法,不像被外界看得,但有不影响本身调用。这个方法就可以声明在延展内,而方法的实现仍然在Student的类内。

      @interface Student ()
      -(void)zuobi;
      @end
      

      通常我们会将类的声明放在扩展名为.h的文件内,实现放在扩展名为.m的文件内。在生产的可执行文件包种.m文件会被编译加密成.a文件,且不可逆转。

      Student.h文件

      @interface Student : NSObject
      
      @property(nonatomic,strong)NSString * name;
      
      @end
      

      Student.m 文件

      @interface Student ()
      -(void)zuobi;
      @end
      
      @implementation Student (Test)
      
      -(void)test
      {
          NSLog(@"这里是Student类目的test方法");
      }
      
      -(void)zuobi
      {
          NSLog(@"正在作弊");
      }
      
      @end
      

      通常将延展的声明也放在.m文件中,这样便可以隐藏类的方法,不被外界所发现且类内可以正常使用。

      3,协议

      OC中的协议为一组方法的声明。不需要实现。遵守协议的类负责实现协议中的方法。

      协议使用@protocol关键字进行声明。

      其声明的方法中分为必须实现的方法和可选实现的方法。分别用@required@optional关键字标示。

      如果不写默认为必须实现的方法。

      @protocol Test 
             
               @required -(void)fun1;//遵守该协议的类,必须实现的方法 @optional -(void)fun2;//遵守该协议的类,可选实现的方法 @end 
             

      制定协议很简单,我们可以通过协议去规定一个对象的行为。

      例如下面的方法

      -(void)test:(id
             
              )obj; 
             

      这个方法便要求,obj对象必须是遵守Test协议的类创建的对象。

      @property id 
             
              obj; 
             

      同样,属性对象也可以用协议进行规定。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇OC教程4目标动作回调-Target Acti.. 下一篇OC教程2继承与复合

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: