1.概念
作为一门动态编程语言,Objective-C 会尽可能的将编译(动态加载)和链接(动态绑定)时要做的事情推迟到运行时。这意味着 Objective-C 语言不仅需要一个编译环境,同时也需要一个运行时系统来执行编译好的代码。运行时它是苹果提供的纯C语言的开发库(是一种非常牛逼、开发中经常用到的底层技术)
2.运行时的作用
屏幕快照 2017-01-16 上午10.20.05.png3.例子:运行时获取成员变量名称
代码分析:
#import <Foundation/Foundation.h>
#import "XMGPerson.h"
#import <objc/runtime.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 成员变量的数量
unsigned int outCount = 0;
// 获得所有的成员变量
// ivars是一个指向成员变量的指针
// ivars默认指向第0个成员变量(最前面)
Ivar *ivars = class_copyIvarList([XMGPerson class], &outCount);
// 遍历所有的成员变量
for (int i = 0; i<outCount; i++) {
// 取出i位置对应的成员变量
// Ivar ivar = *(ivars + i);
Ivar ivar = ivars[i];
// 获得成员变量的名字
NSLog(@"%s", ivar_getName(ivar));
}
// 如果函数名中包含了copy\new\retain\create等字眼,那么这个函数返回的数据就需要手动释放
free(ivars);
// Ivar ivar = *ivars;
// Ivar ivar2 = *(ivars + 1);
// NSLog(@"%s %s", ivar_getName(ivar), ivar_getName(ivar2));
// 一个Ivar就代表一个成员变量
// int *p; 指向int类型的变量
// Ivar *ivars; 指向Ivar类型的变量
}
return 0;
}
获取UITextFiled成员变量的名称
831339-6e0b3108f4104f85.png 屏幕快照 2017-01-16 上午10.22.36.png4.基础
1.动态的类型
2.动态的绑定
3.动态的加载
OC的编译与运行
1.开始的代码阶段2.点击编译之后先执行预编译和去掉一些注释,然后才是进行编译。3.编译成功之后就开始运行,消息只有到运行时才会和函数实现绑定起来,而不是按照编译好的逻辑一成不变的执行。按照我的理解,编译阶段只是确定了要去向receiver对象发送message消息,但是却没有发送,真正发送是等到运行的时候进行。因此,编译阶段完全不知道message方法的具体实现,甚至,该方法到底有没有被实现也不知道。这就有可能导致运行时崩溃问题。4.-isMemberOfClass: 是 NSObject 的方法,用以确定某个 NSObject 对象是否是某个类的成员。与之相似的为 -isKindOfClass:,可以用以确定某个对象是否是某个类或其子类的成员。这两个方法为典型的introspection方法。在确定对象为某类成员后,可以安全地进行强制转换,继续之后的工作。
验证某个类是否遵循协议也可以用conformsToProtocol
// 重点: 通过协议实现委托回调
// 视图做不了的事情通过一个协议指针委托视图控制器来完成
if ([_delegate conformsToProtocol:@protocol(CDDetailViewDelegate)]) {
[_delegate detailView:self photoButtonClickedAtIndex:sender.tag - kPhotoButtonTagStartValue];
}
链接:http://blog.csdn.net/wzzvictory/article/details/8615569
单词:
1.receiver:接收器
2.meta: 元
3.dynamic: 动态的
4.conforms: 符合
5.resolve:决定
5.iOS底层
屏幕快照 2017-01-16 上午10.24.27.png 屏幕快照 2017-01-16 上午10.24.40.png 屏幕快照 2017-01-16 上午10.24.54.png 屏幕快照 2017-01-16 上午10.25.56.png 屏幕快照 2017-01-16 上午10.26.08.png- (void)parseObject:(id)object {
for (id data in object) {
if ([[data type] isEqualToString:@"String"]) {
[self parseString:[data value]];
} else if ([[data type] isEqualToString:@"Number"]) {
[self parseNumber:[data value]];
} else if ([[data type] isEqualToString:@"Array"]) {
[self parseArray:[data value]];
}
}
}
- (void)parseObjectDynamic:(id)object {
for (id data in object) {
[self performSelector:NSSelectorFromString([NSString
stringWithFormat:@"parse%@:", [data type]]) withObject:
[data value]];
}
}
- (void)parseString:(NSString *)aString {}
- (void)parseNumber:(NSString *)aNumber {}
- (void)parseArray:(NSString *)aArray {}
可一看到,你可以把7行带if的代码变成1行。将来如果有新的类型,只需增加实现方法即可,而不用再去添加新的 else if。
屏幕快照 2017-01-16 上午10.29.36.png 屏幕快照 2017-01-16 上午10.29.59.png 屏幕快照 2017-01-16 上午10.30.17.png 屏幕快照 2017-01-16 上午10.30.28.png 屏幕快照 2017-01-16 上午10.30.41.pngios中Runtime的介绍以及使用
http://www.jianshu.com/p/595e4c63c732
http://www.jianshu.com/p/add581f0e8bb#
网友评论