zoukankan      html  css  js  c++  java
  • [objective-c] 03

    本章主要讲解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 <NSObject>
    
    @required
    -(void)fun1; // 遵守该协议的类,必须实现的方法
    
    @optional
    -(void)fun2; // 遵守该协议的类,可选实现的方法
    
    @end
    

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

    例如下面的方法

    -(void)test:(id<Test>)obj;
    

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

    @property id <Test>obj;
    

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

  • 相关阅读:
    Silverlight入门:第四部分 数据绑定
    [Silverlight入门系列]使用MVVM模式(6):使用Behavior
    Silverlight入门:第二部分 定义界面布局和导航
    [Silverlight入门系列]使用MVVM模式(2):集合Model /ObservableCollection/ICollectionView
    建立可扩展的silverlight应用框架 step5:整理Module
    Silverlight入门:第六部分 美化用户界面的样式与模板
    [Silverlight入门系列]使用MVVM模式(7):ViewModel的INotifyPropertyChanged接口实现
    Silverlight WCF RIA服务(五)使用SL商业应用模板
    Silverlight WCF RIA服务(四)如何添加和移除RIA Services Link
    Asymptote 学习记录(3) 画赵爽弦图练习
  • 原文地址:https://www.cnblogs.com/lqios/p/4271976.html
Copyright © 2011-2022 走看看