美文网首页
类目和延展的作用和区别

类目和延展的作用和区别

作者: 御风邪物 | 来源:发表于2016-06-28 16:24 被阅读149次

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

      类目也叫分类,英文Category,在没有原类.m文件的基础上,给该类添加方法。
      比如,NSString类原本没有helloString方法,我们又没有NSString类的原代码,那我们想给NSString
    类添加一个helloString的方法,只有通过声明子类或者类目才可以达到这个目的。
    

    二、类目的声明:

    @interface NSString (hello)
    -(void)helloString;
    @end
    

    三、类目实现:

    @implementation NSString (hello)
    -(void)helloString{
      NSLog(@"my name is %@,I am a string",self);
    }
    @end
    文件名:
      NSString+hello.h
    使用:
      NSString *str = @"蓝鸥科技";
      [str helloString];
    打印输出:
    my name is 蓝鸥科技,I am a string
    helloString 实现里面用到的self就是调用这个方法的实例本身。
    

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

      1、类目里不能添加实例变量,但是类目声明可以用属性,其实属性就是一对儿方法,那么在.m里面需要实现
    这个属性的setter方法和getter方法,在这两个实现方法里面依然不能使用自己添加的实例变量。
      2、类目里添加的方法不能和原始类中的方法重名,否则会导致覆盖。
      3、一个类可以添加多个类目,但是类目名和方法名不能重复。
      4、类目中的方法可以成为原始类的一部分,和原始类方法级别相同,可以被子类继承。
    
    延展也叫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文件,则不能加实例变量。

    相关文章

      网友评论

          本文标题:类目和延展的作用和区别

          本文链接:https://www.haomeiwen.com/subject/zvytjttx.html