博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
研究Extension和Category的一个例子
阅读量:4322 次
发布时间:2019-06-06

本文共 1919 字,大约阅读时间需要 6 分钟。

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

 

 

 

使用runtime机制在category中向原有类中添加变量。 

---------------------------------------------------------------

//NSObject+IndieBandName.h@interface NSObject (IndieBandName)@property (nonatomic, strong) NSString *indieBandName;@end

  

// NSObject+IndieBandName.m    #import "NSObject+Extension.h"#import 
static const void *IndieBandNameKey = &IndieBandNameKey; @implementation NSObject (IndieBandName)@dynamic indieBandName;- (NSString *)indieBandName { return objc_getAssociatedObject(self, IndieBandNameKey); //更精致的写法 objc_getAssociatedObject(self, _cmd);}- (void)setIndieBandName:(NSString *)indieBandName{ objc_setAssociatedObject(self, IndieBandNameKey, indieBandName, OBJC_ASSOCIATION_RETAIN_NONATOMIC); //更精致的写法 objc_setAssociatedObject(self, @selector(indieBandName), indieBandName, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}@end

  

 

转载于:https://www.cnblogs.com/dongfangchun/p/5620797.html

你可能感兴趣的文章
js调用.net后台事件,和后台调用前台等方法总结
查看>>
Vert.x 之 HelloWorld
查看>>
太阳能路灯项目背景知识
查看>>
Objec类和final关键字的用法
查看>>
打开matlab遗传算法工具箱的方法
查看>>
Ajax制作智能提示搜索
查看>>
打赏页面
查看>>
JAVA之线程同步的三种方法
查看>>
OOP之属性继承和方法继承
查看>>
PostgreSQL调用函数
查看>>
ASP.NET MVC+EF框架+EasyUI实现权限管理(附源码)
查看>>
sitecore系统教程之体验编辑器中创建一个项目
查看>>
socket笔记
查看>>
Java 概述及安装使用
查看>>
helloworld
查看>>
港交所OMD-C对接笔记
查看>>
线程安全问题了解一下
查看>>
转:IPv4的地址真的用光了吗
查看>>
java rmi远程方法调用实例
查看>>
Linux设置环境变量小结
查看>>