您的位置:首页 > 移动开发 > Objective-C

第02天实战技术(01):runtime回顾

2017-03-25 00:00 393 查看
消息机制

任何方法调用本质 : 发送一个消息,用runtime发送消息,OC底层实现通过runtime实现
>>> OC
id objc = [NSObject alloc]; // 分配内存
objc = [objc init]; //  初始化

>>> runtime
id objc = objc_msgSend([NSObject class], @selector(alloc));
objc = objc_msgSend(objc, @selector(init));


2.交换方法

修改系统的方法 是用交换方法
Method imageNamedMethod = class_getClassMethod(self, @selector(imageNamed:));
Method lyh_imageNamedMethod = class_getClassMethod(self, @selector(lyh_imageNamed:));

method_exchangeImplementations(imageNamedMethod, lyh_imageNamedMethod);


3.动态添加方法

Person *p = [[Person alloc]init];
[p performSelector:@selector(run:) withObject:@15];

>>>
// 解决类方法
// + (BOOL)resolveClassMethod:(SEL)sel
// 解决类方法
+ (BOOL)resolveInstanceMethod:(SEL)sel

>>> 在方法里面进行执行(有没有这个方法)
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
if (sel == NSSelectorFromString(@"run:")) {
class_addMethod(self, sel, (IMP)test, "v@:");
return YES; // 表示处理完毕 不会进来这里了
}

return [super resolveInstanceMethod:sel];
}

>>> runtime动态添加方法的函数
#pragma mark 函数的实现
#pragma 1.没有参数的方法
// 函数
// 没有返回值,也没有参数
// void,(id,SEL)
void aaa(id self , SEL _cmd)
{
NSLog(@"吃东西");
}
#pragma 2.带参数的方法
void test(id self , SEL _cmd, NSNumber *meter)
{
NSLog(@"跑了%@公里",meter);
}


4.动态添加属性

给系统添加属性 比如给NSObject 添加一个name属性

>>> code
// set方法
- (void)setName:(NSString *)name
{
// 设值
objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
// get方法
- (NSString *)name
{
// 取值
return objc_getAssociatedObject(self, @"name");
}


5.自动生成属性代码

6.字典转模型KVC实现

比如模型 需要定义很多个属性,这时候 我们可以使用runtime去实现

>>> code
#import "NSDictionary+Property.h"

@implementation NSDictionary (Property)
- (void)createPropertyCode
{
NSMutableString *codes = [NSMutableString string];
// 1.遍历字典
// enumerateKeysAndObjectsUsingBlock 遍历字典
[self enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
NSString *code;

if ([obj isKindOfClass:[NSString class]]) {
code = [NSString stringWithFormat:@"@property(nonatomic, strong) NSString * %@;",key];
}
else if ([obj isKindOfClass:NSClassFromString(@"__NSCFBoolean")])
{
code = [NSString stringWithFormat:@"@property(nonatomic, assign) BOOL  %@;",key];
}
else if ([obj isKindOfClass:[NSNumber class]])
{
code = [NSString stringWithFormat:@"@property(nonatomic, assign) NSInteger  %@;",key];

}
else if ([obj isKindOfClass:[NSArray class]])
{
code = [NSString stringWithFormat:@"@property(nonatomic, strong) NSArray * %@;",key];

}
else if ([obj isKindOfClass:[NSDictionary class]])
{
code = [NSString stringWithFormat:@"@property(nonatomic, strong) NSDictionary * %@;",key];
}

[codes appendFormat:@"\n%@\n",code];
}];

NSLog(@"-- %@",codes);
}
@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Objective-C RunTime