• Objective-C中的类目(Category),延展(Extension)


    类目和延展的作用都是为了扩展一个类。

    Objective-C中的类目(Category)

    一、类目的定义和作用

    类目也叫分类,英文Category,在没有原类.m文件的基础上,给该类添加方法。

    比如,NSString类原本没有helloString方法,我们又没有NSString类的原代码,那我们想给NSString类添加一个helloString的方法,只有通过声明子类或者类目才可以达到这个目的。

    二、类目的声明:

    @interfaceNSString (hello)

    - (void)helloString;

    @end

    三、类目实现:

    @implementationNSString (hello)

    - (void)helloString

    {

    NSLog(@"my name is %@,I am a string",self);

    }

    @end

    文件名:

    NSString+hello.h

    使用:

    NSString * str = @"我要上天";

    [strhelloString];

    打印输出:

    my name is 我要上天,I am a string

    helloString 实现里面用到的self就是调用这个方法的实例本身。

    四、类目使用需要注意的问题:

    1、类目里不能添加实例变量,但是类目声明可以用属性,其实属性就是一对儿方法,那么在.m里面需要实现这个属性的setter方法和getter方法,在这两个实现方法里面依然不能使用自己添加的实例变量。

    2、类目里添加的方法不能和原始类中的方法重名,否则会导致覆盖。

    3、一个类可以添加多个类目,但是类目名和方法名不能重复。

    4、类目中的方法可以成为原始类的一部分,和原始类方法级别相同,可以被子类继承。

    局限性: 在类目中只可以为类添加方法,不能添加实例变量; 类目中得方法的优先级要高。

    Objective-C中的延展(Extension)

    延展也叫Extension:

    延展是一种特殊形式的类目,主要是在一个类的.m里面声明与实现

    延展的作用:就是给某类添加私有方法或私有变量

    比如RootViewController.m

    @interface RootViewController ()

    {

    NSString * aString ;

    }

    - (void)test1;

    - (void)test2; 

    @end

     

    @implementation RootViewController

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    {

    self = [super initWithNibName:nibNameOrNilbundle:nibBundleOrNil];

    if (self) {

    // Custom initialization

    }

    return self;

    }

    @end

    上面@interface @end定义的就是一个延展,主要定义了RootViewController的私有方法和私有变量。

    五、使用延展需要注意的几个问题:

    1、如果括号里没有类目名,则认为延展里面的方法为全都必须实现,如果有名,则认为是可选实现。

    2、虽然延展是给一个类定义私有方法,但是没有OC没有绝对的私有方法,其实还是可以调用,另外延展里面声明的变量只能在该类内部使用,外界访问不了。

    3、如果是新建文件建的某类延展.h文件,则不能加实例变量。

  • 相关阅读:
    前端学PHP之语句
    前端学PHP之运算符
    ASP.NET MVC的TextBoxFor()和TextBox()
    在_Layout模版中使用@Styles.Render()没有效果
    使用HTML.ActionLink实现一个图片链接
    微软最有价值专家大中华峰会花絮视频
    激活当前视图菜单高亮呈现
    获取当前视图名
    Razor语法中链接的一些方法
    Razor语法的一些特殊需求输出
  • 原文地址:https://www.cnblogs.com/crazygeek/p/5550824.html
Copyright © 2020-2023  润新知