Objective-C的类目和延展

    xiaoxiao2021-04-11  41

    类目:为已知的类增加新的方法

    延展:通知在本类的定义里使用类目来声明私有方法;

    一、类目:

    1. 类目方法的应用:

    对现有类进行扩展:比如:可以扩展Cocoa touch框架中的类,在类目中增加的方法会被子类继承,而且在运行时跟其他的方法没有区别。作为子类的替代手段:不需要定义和使用一个子类,可以通过类目直接向已有的类里增加方法。对类中的方法归类:利用catigory把一个庞大的类划分为小块来分别进行开发,从而更好地对类中的方法进行更新和维护。

    2. 类目方法的局限性:

    无法向类目中添加新的实例变量,类目没有位置来容纳实例变量。如果想增加类的实例变量,只能通过定义子类的方式如若,在类目中覆盖先前类的方法。这样会引起super消息的断裂,因为类目super的方法具有更高的优先级,因此,一般不要覆盖现有类中的方法。

    3.类目的定义:

          类目的命名规则:类名+扩展方法,如“NSString+Revert”。 类目的接口声明与类的定义十分相似,但类目不继承父类,只需要带有一个括号表明该类目的主要用途。

    NSString+Revert.h文件:

    [java]  view plain  copy #import <Foundation/Foundation.h>      @interface NSString (Revert)      - (void)test;      @end   NSString+Revert.m文件:

    [java]  view plain  copy #import "NSString+Revert.h"      @implementation NSString (Revert)      - (void)test{   }      @end  

    二、延展:

    类的延展可以看作是一种 匿名的类目 ,类有时需要一些只为自己所见、所用的私有方法。这种私有方法可以通过延展的方式来声明,延展中定义的方法在 类本身 的@implementation代码区域中进行实现。 [java]  view plain  copy @interface MyObject : NSObject    {        NSNumber *number;  }    - (NSNumber *)number;    @end  @interface MyObject (Setter)    - (void)setNumber:(NSNumber *)newNumber;   @end    @implementation MyObject    - (NSNumber *)number   {        return number;    }   - (void)setNumber:(NSNumber *)newNumber   {!//do something   }   @end  

    Extension是Category的一个特例

    其名字为空,并新添加的方法一定要予以实现 (category没有这个限制)

    @intfacet Person ( )  {        类扩展

           int _age;                        可以增加新的实例变量   (category不可以)

    }

    -(void)setAge:(int)age;

    @end

    延展的实现

    @interface Person : NSObject

    @end

    扩展/延展/延展分类

    延展是一个特殊的分类

    特点:

    1 可以增加实例变量

    2 不能使用 @implementation 类名 () 去实现类别方法,要在被延展的类中实现

    @interface Person ()

    {   int _age;  }

    -(void)run;

    @end

     

    3 可以定义私有的变量和方法

            当在定义延展的时候不提供类目名时,延展中定义的方法既被视为“必须实现”的API。在这种情况下,如果方法缺少实现代码,则编译器会报警告,此时方法的实现必须出现在类主体的@implementation代码

    转载请注明原文地址: https://ju.6miu.com/read-666596.html

    最新回复(0)