天天看點

類擴充(類别名稱為空的category)

以下内容屬于初學者的一點疑惑,純屬做筆記,不喜勿噴。

之前在學習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。

繼續閱讀