研究Extension和Category的一个例子
2016-06-27 17:27
387 查看
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中向原有类中添加变量。
---------------------------------------------------------------
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 <objc/runtime.h> 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
相关文章推荐
- POJ 2195 Going Home (最小费用最大流)
- 论文笔记 | Going deeper with convolutions
- Django项目结构布局
- LightOJ 1030 Discovering Gold
- mongo的数据备份
- Poj 2723 Go Deeper【2-SAT-----Tarjan强连通+二分】
- 特殊矩阵——三对角矩阵(Tridiagonal Matrix)
- hdu_3966_Aragorn's Story(树链剖分裸题)
- hdu_3966_Aragorn's Story(树链剖分裸题)
- 【读书笔记】Zygote 和 System 进程的启动过程
- 谷雪梅 Google中国
- Go语言学习笔记1
- 贪婪算法(Greedy Algorithm)
- 课后作业静态网页制作-仿Argo官网
- GOF-23种设计模式——装饰模式(学习笔记)
- 深入理解go的slice和到底什么时候该用slice?
- pgoneproxy使用tcmalloc来管理内存
- UVA 11292[Dragon of Loowater ]
- Windows 7 64位下解决不能创建Django项目问题
- CategorySecond (vo,xml)