研究Extension和Category的一个例子

Posted 东方春

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了研究Extension和Category的一个例子相关的知识,希望对你有一定的参考价值。

Category:

    1. 无法添加实例变量

    2.将类的实现分散到多个不同文件或多个不同框架中。

 

Extension:

    1. 可以添加实例变量

 

 

注: 如果Category的头文件中也使用Extension(即将 @interface MyData (XX)改为@interface MyData() ),依然不能使用变量。

千万不要认为在任何地方使用Extension,编译器都会将变量放进来。

但是如果MyData.m中,包含以下MyData+XX.h,那就可以运行通过。

所以什么情况下内存会将变量包含进来呢? 就是:为标准声明(@interface MyData:NSObject)or 能够已经包含进MyData.m的Extension。

 

 

如下代码,外部的Extension的property可以被使用,本质原因就是在MyData.m中已经包含进来了(本质上还是因为已经成为了内部Extension)

 

----------MyData.h----------

#import <Foundation/Foundation.h>

@interface MyData : NSObject 

@end

 

----------MyData.m----------

#import "MyData.h"

#import "MyData+XX.h" //这句话是关键,如果没有这句话变量依然无法放到类实例内存中

@interface MyData ()

@end

@implementation MyData

@end

 

 

----------MyData+XX.h----------

#import <Foundation/Foundation.h>

#import "MyData.h"

@interface MyData ()  //如果制定定义为 category,就是标准的category了。

@property (nonatomic, strong) NSString *strTest3;

- (void)put2;

@end

 

 

----------MyData+XX.m----------

#import "MyData.h"

#import "MyData+XX.h" 

@implementation MyData (XX)

- (void)put2{

    self.strTest3 = @"abc";

}

@end

 

以上是关于研究Extension和Category的一个例子的主要内容,如果未能解决你的问题,请参考以下文章

iOS中的category和extension

Extension

iOS学习笔记06—Category和Extension

Objective-C中的类目(Category),延展(Extension)

当 Codegen 处于 ClassDefinition 或 Category/Extension 中时,如何让 SwiftUI 预览工作?

iOS中分类(Category)和类扩展(Extension)的区别