以下内容属于初学者的一点疑惑,纯属做笔记,不喜勿喷。
之前在学习Objective-C的时候,就有看到这样一种说法:
类别中可以添加方法,但不能添加实例变量
然后在学习iOS开发的时候,一直很疑惑这种形式:
/* ViewController.m */
@interface ViewController ()
@property (nonatomic, strong) UIView *container;
@end
@implementation ViewController
...
@end
这里的括号应该是代表添加类别,然后居然添加了属性,添加属性难道不会自动生成实例变量吗?
在某度看了很多关于category中的property的介绍之后,都说
property和实例变量是不一样的,category中的property是不会添加实例变量的,只会添加getter和setter方法。
原来是这样,以为未来一片光明,开心地继续学下去的时候,看到了这样的代码:
@interface PlayerViewController ()
@property (nonatomic, strong) UIView *containerView;
@end
@implementation PlayerViewController
- (void)viewDidLoad {
[self.view addSubview:self.containerView];
...
}
// 初始化容器
- (UIView *)containerView {
if (!_containerView) {
_containerView = [UIView new];
}
return _containerView;
}
???
_containerView
是怎样?不是没有生成实例变量吗?现在怎么还光明正大地用上了?
好吧只能从类别名为空(@interface ViewController ()
)这里来找找看了,不小心还真找到了这种用法。
据说这种用法叫类扩展
1、适用范围
扩展是分类的一种特殊形式。
2、语法格式
@interface 主类类名()
@end
扩展通常定义在主类.m文件中,扩展中声明的方法直接在主类.m文件中实现。
3、注意事项
扩展中可以声明实例变量,可以声明属性
因为扩展通常定义在主类的.m文件中,所以扩展声明的方法和属性通常是私有的
4、分类和扩展的区别
分类是不可以声明实例变量,通常是公开的,文件名是:主类名+分类名.h
扩展是可以声明实例变量,是私有的,文件名为:主类名_扩展标识.h,在主类的.m文件中#import该头文件
好吧这里就已经很清楚了,类扩展可以添加实例变量,over。