延展

  • 延展(Extension).是1个特殊的分类.

    • 延展是1个分类.比较特殊.
    • 所以它的作用:也是用来扩展1个类.
  • 特殊在于:

    • -> 这个分类没有名字.叫做匿名分类
    • -> 这个分类只有声明.不能有单独的实现. 与本类共享1个实现.
    @interface Student ()

    @end
  • 我们新建1个延展.只会生成1个.h文件.

    • 这个延展的声明

    @interface 本类名 ()

    @end

    • 没有单独的实现

  • 延展的特点

    • -> 可以在延展中声明属性.
    • -> 可以在延展中声明@property
      • 并且会自动的生成私有属性. 也会生成getter、setter的声明和实现.
      • getter和setter的实现是在本类的实现文件中.
  • -> 可以在延展中声明方法.但是方法的实现要实现在本类的实现中.

  • 延展和分类的相同点: 都是对1个类进行扩展.

  • 延展和分类的区别:

    • . 声明是不一样的。 分类是有分类名的 而延展没有分类名 是匿名.
    • . 分类有声明和实现 延展只有声明 没有实现. 和本类共享实现.
    • . 分类只能声明方法和@property(不能生成私有属性)
    • 延展 可以声明属性 方法 @property会自动生成私有属性.

  • 分类和延展的各自的使用场景
    • 分类是用来为本类添加方法的
    • 延展不仅可以为本类添加方法 还可以添加属性.

  • 延展的应用场景.

  • 我们可能会有这样的需求:

    • 写1个私有的@property.这个@propety生成的属性、getter、setter都不允许被外界访问.只在类的内部访问.
    • 有人说,那我手动实现就好: 在@implementation之中写1个私有属性,在写1个私有的getter和setter。
    • 我想说,太麻烦. 本来1个@property可以搞定的事情干嘛还要写这么多代码呢?
  • 解决方案:

    • 将类的延展写在类的.m文件上. 就可以在延展中定义@property、方法、属性.
    • 那么这个时候,@property生成的属性、getter、setter都是私有的.外部无法访问.

    // Person.m

 #import "Person.h"

     @interface Person ()
     //可以在这类声明属性、方法、@property
     @end

     @implementation Person
     //本类的方法实现.
     //延展的方法实现.
     //在这里可以访问延展中定义的成员.
     @end
  • 使用建议:

    • 如果@property、方法、属性需要被外界访问,就定义在本类的声明中.
    • 如果不需要被外界访问.就定义在延展之中.

      经典应用案例: iOS开发的控制器.

实现为类写私有成员的方式

  • 在类的.m文件之中,写上1个延展. 将成员定义在延展之中.
    • 那么定义在延展之中的成员就是私有成员 只能在类的内部访问
    • 在类的外部是无法访问的.

  • 总结

    • . 延展绝大多数情况下,不会独占1个文件.
      • 因为延展的作用就是用来私有化类的成员的. 属性 方法 @property
    • . 延展大多数情况下,是写在本类模块的.m文件中.
      • 如果类的成员需要被外界访问 这些成员就定义在本类的声明之中,
      • 如果类的成员只希望在类的内部访问 那么就可以将其定义在延展之中.

  • 延展作用: 是用来私有化类的成员. 如果类中有些成员我们希望只在类的内部访问
    - 那么就在类的实现中写1个延展 将需要私有化的成员写在延展之中.

    • 延展中的成员只能在类的内部访问 不能再类的外部访问.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值