以下内容屬于初學者的一點疑惑,純屬做筆記,不喜勿噴。
之前在學習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該頭檔案
來源https://blog.csdn.net/lvxiangan/article/details/44600947
好吧這裡就已經很清楚了,類擴充可以添加執行個體變量,over。