zoukankan      html  css  js  c++  java
  • oc-类目、延展、协议

    -----------------------------------------------Category--------------------------------------

    类目 是在原有类的基础上 添加方法,在使用的时候只需要用原有类实例化出来的对象,调用即可。在类目里面 不可以添加变量、属性,只能添加方法。

     1.实际开发在什么情况下使用呢?

         答:扩展已经封装好的类(不希望再改变原有类)这种情况下只能用 类目

           在团队里面 分工开发一个模块的时候 使用Category

             

    2.不要覆盖原有类的方法,这样会引起super消息的断裂,因为类目的中的方法具有更高的优先级。

     

     3.类目 和 继承 有什么不同

    继承:可以扩展父类的方法,可以添加实例变量,属性。

    类目:可以扩展原有类的方法;不可以可以添加实例变量,属性。

     

    4.扩展方法的调用方式

             继承:用子类的对象,调用扩展方法。

             类目:依然使用原有类的对象调用。

    5.新建Object -C.file文件 会出现原有类+(你所建的扩展内容的名字);

    例:扩展数组

    代码:

    在.h文件中声明你所需要扩展的方法:

    #import <Foundation/Foundation.h>

     

    @interface NSArray (Arr)

    -(NSString *)link;

    @end

     

    在.m文件中实现你所需要扩展的方法:

    #import "NSArray+Arr.h"

     

    @implementation NSArray (Arr)

    -(NSString *)link{

        NSMutableString *str = [[NSMutableString alloc]init];

        for (id n in self)

            [str appendString:n];

        return str;

    }

     @end

     

    在主文件中调用:

    NSArray *y = @[@“我爱中国”,@"我爱oc",@"我爱青山绿水"];

    NSLog(@"%@",[y link ]);

     

    输出的结果为:

    我爱中国我爱oc我爱青山绿水

     

    --------------------------------------------Extension---------------------------------------

    类的延展 就是在类中添加私有方法、变量,延展中的声明的方法在类本身的@interfance 类名 ()和它对应的@end之间实现

    类有时需要方法只有自己可见,这时我们可以通过延展的方式定义类的私有方法

    但是这种方式和之前定义的@private的区别  

    两者的区别就是@private在.h文件中定义的,一个延展是在.m文件中定义的  

    如果是开源的话,一般是开放.h文件  

    如果是闭源的话,一般只开放.m文件  

     

    注意:私有方法,只是在.m文件中定义了,没有在.h文件中声明,一般是在类中自己使用的

    创建延展有两种方式:

    1.新建Object-C.file——>extension,出现oo.h文件

     

    2.直接在类的.m文件中,在@implementation上面 输入

    @interface see()

    @end

    例:

    新建一个Person类。在其.m文件中:

    //添加一个私有的变量和方法。

    #import “Penson.h"

     

    @interface Penson()

    {

        NSString *name;

        

    }

    -(void)name;

    @end

     

     

    @implementation Penson

    -(void)name{

        name = @"人物";

        NSLog(@"%@你创建成功了",name);

    }

     

    -(void)impli:(NSString *)k{

        NSLog(@"%@",k);

        [self name];

    }

    @end

     

     

    Protol------------------------------Protocol-------------------------------------------

    1.协议可以被任何类实现的方法,协议本身不是类,它是定义了一个其他类可以实现的接口。

    协议是 只声明 不实现

     (没有实现的类目 又叫 非正式协议。

             因为一般情况下类都从NSObject继承

             )

    2.非正式协议是以圆括号()表示,而正式协议是以<>来表示的 协议是用尖括号来引入

    在哪一个类里面导入了协议 就在哪一个类里面 实现这个协议方法

     //        默认的都是required强制实现的方法,不实现就报错。

    //        选择实现的 @optional 可以实现的 可以不实现。

    新建协议后,只会出现一个.h文件

    @protocol xieyi <NSObject>

    -(void)fangfa;

    @optional 

    -(void)fangfa1;

    @end

    在某一个类中引入xieyi.h这个协议后。

    -(void)fangfa;这个方法必须要实现,不然就报错

    而-(void)fangfa1;加了@optional 后,可以选择实现或者不实现。不实现也不会报错。

    注意:如果在类中要引入多个协议 可以,号隔开@interface Person : NSObject<xixieyi,shangke,zixi,zongjie>

     

  • 相关阅读:
    [转]AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
    C#文档注释
    VS 单元测试项目,测试的时候运行按钮不可用
    获取泛型类的Type
    Sql 复习(4)
    Sql 复习(3)
    sqlserver的soundex
    sqlserver的trim
    Sql 复习(2)
    糟糕的设计
  • 原文地址:https://www.cnblogs.com/chenhongios/p/4601649.html
Copyright © 2011-2022 走看看