您的位置:首页 > 编程语言 > Go语言

研究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中向原有类中添加变量。

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

//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


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: