什么是动态语言 OC 的runtime

时间:2023-03-09 13:12:47
什么是动态语言  OC 的runtime

OC是一门 动态语言。

问题来了。什么是动态语言? 与之相对的静态语言?

学习C++的时候,记得一个名词:“运行时的动态绑定”。 这个是 “多态”的概念。

简单提一下:关键:类指针可以指向本类,或者其子类。  当该类调用(虚函数)函数, 真正调用的是子类,还是本类? 是在其运行期间看该 指针指向内存 真正的存储类型。 这是在运行期间做的,在编译期间做不到。

这只是“运行时动态绑定”或者叫做“多态”的概念,并不是 “动态语言” 的特性!

动态语言:指程序在运行期间,对象的函数、对象的变量 可以被更改!

其中最常用的:

1,获取成员变量的名字(nsstring)

unsigned int numIvars; //成员变量个数
Ivar *vars = class_copyIvarList(NSClassFromString(@"UIView"), &numIvars);
//Ivar *vars = class_copyIvarList([UIView class], &numIvars); NSString *key=nil;
for(int i = ; i < numIvars; i++) { Ivar thisIvar = vars[i];
key = [NSString stringWithUTF8String:ivar_getName(thisIvar)]; //获取成员变量的名字
NSLog(@"variable name :%@", key);
key = [NSString stringWithUTF8String:ivar_getTypeEncoding(thisIvar)]; //获取成员变量的数据类型
NSLog(@"variable type :%@", key);
}
free(vars);
- (NSString *)nameWithInstance:(id)instance
{
unsigned int numIvars = ;
NSString *key=nil;
Ivar * ivars = class_copyIvarList([self.target class], &numIvars);
for(int i = ; i < numIvars; i++) {
Ivar thisIvar = ivars[i];
const char *type = ivar_getTypeEncoding(thisIvar);
NSString *stringType = [NSString stringWithCString:type encoding:NSUTF8StringEncoding];
if (![stringType hasPrefix:@"@"]) {
continue;
}
if ((object_getIvar(self.target, thisIvar) == instance)) {
key = [NSString stringWithUTF8String:ivar_getName(thisIvar)];
break;
}
}
free(ivars);
return key; }

2获取运行时的函数名称

Method *meth = class_copyMethodList(NSClassFromString(@"UIView"), &numIvars);

    //Method *meth = class_copyMethodList([UIView class], &numIvars);

    for(int i = ; i < numIvars; i++) {

        Method thisIvar = meth[i];

        SEL sel = method_getName(thisIvar);

        const char *name = sel_getName(sel);

        NSLog(@"zp method :%s", name);

    }

    free(meth);

参考

http://my.oschina.net/taptale/blog/110626

http://www.th7.cn/Program/IOS/201406/213919.shtml