延展
延展(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个文件.
延展作用: 是用来私有化类的成员. 如果类中有些成员我们希望只在类的内部访问
- 那么就在类的实现中写1个延展 将需要私有化的成员写在延展之中.- 延展中的成员只能在类的内部访问 不能再类的外部访问.
更多推荐
延展
发布评论