• [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;
    

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

  • 相关阅读:
    2020年北航OO助教工作总结
    OO第四单元——UML及其解析器——总结 暨 OO课程大总结
    OO第三单元——规格化设计与地铁系统——总结
    OO第二单元——电梯调度——总结
    OO第一单元——表达式求导——总结
    try_svg
    字体自适应
    网站使用微软雅黑需要版权吗
    body,td,th {
    input一定要在from里吗
  • 原文地址:https://www.cnblogs.com/lqios/p/4271976.html
Copyright © 2020-2023  润新知