Working with Classes

1 const char * class_getName(Class cls);
AClass *aclass = [[[AClass class] alloc] init];
[aclass setValue:@"我的名字" forKey:@"name"];
NSLog(@"name=:%@",aclass.name);
NSLog(@"classname=:%@",aclass.class);
Class class = NSClassFromString(@"xxx");
const char * xxClassName = class_getName(class);
NSLog(@"==:%@",[NSString stringWithFormat:@"%s",xxClassName]);
输出如下 如果发生错误返回空
2017-05-05 10:18:24.124 RuntimeTest[11670:359407] name=:我的名字
2017-05-05 10:18:24.997 RuntimeTest[11670:359407] classname=:AClass
2017-05-05 10:18:27.173 RuntimeTest[11670:359407] ==:nil
----------------------------分割线----------------------------------
2 Class class_getSuperclass(Class cls);
AClass *aclass = [[[AClass class] alloc] init];
Class class = class_getSuperclass(aclass.class);
const char * xxClassName = class_getName(class);
NSLog(@"==:%@",[NSString stringWithFormat:@"%s",xxClassName]);
输出:
==:NSObject

---------------------------分割线----------------------------------
3 BOOL class_isMetaClass(Class cls);
AClass *aclass = [[[AClass class] alloc] init];
Class class = aclass.class;
BOOL isnotMetaClass = class_isMetaClass(class);
NSLog(@"=:%d",isnotMetaClass);
Class metaClass = object_getClass(class);
NSLog(@"==:%d",class_isMetaClass(metaClass));
--------------------------分割线------------------------------------
4 size_t class_getInstanceSize(Class cls);
size_t size = class_getInstanceSize([AClass class]);
NSLog(@"size=:%zu",size);//不同系统可能不一样.苹果公司对内存优化了。
--------------------------分割线-------------------------------------
5 Ivar class_getInstanceVariable(Class cls, const char *name);
Ivar var = class_getInstanceVariable([[[AClass alloc] init] class], "_name");//这是有个下划线
const char *varName = ivar_getName(var);
NSLog(@"varname=:%s",varName);
6 -----------------------分割线---------------------------------------
Ivar class_getClassVariable(Class cls, const char *name);
就一个类变量 isa
Ivar isaVar = class_getClassVariable([AClass class], "isa");
const char *age = ivar_getName(isaVar);
NSLog(@"age=:%s",age);
7-------------------------分割线-------------------------------------
BOOL class_addIvar(Class cls, const char *name, size_t size, uint8_t alignment, const char *types);
// 这样写有漏洞先这样吧
Class myClass = objc_allocateClassPair([NSObject class], "TEST", 0);
class_addIvar(myClass, "myVar", sizeof(id), log2(sizeof(id)), "@");
objc_registerClassPair(myClass);
id _myClass =[[myClass alloc] init];
[_myClass setValue:@"XXXX" forKey:@"myVar"];
NSLog(@"==:%@",[_myClass valueForKey:@"myVar"]);
_myClass = nil;
objc_disposeClassPair(myClass);
8-------------------------分割线-------------------------------------
Ivar * class_copyIvarList(Class cls, unsigned int *outCount);//这个方法可能是runtime里用的比较多的方法了。
unsigned int outCount=0;
Ivar * ivars = class_copyIvarList([AClass class], &outCount);
for (unsigned int i = 0; i < outCount; i ++) {
Ivar ivar = ivars[i];
const char * name = ivar_getName(ivar);
const char * type = ivar_getTypeEncoding(ivar);
NSLog(@"type=: %s varName=: %s ",type, name);
}
free(ivars);//释放
9-------------------------分割线-------------------------------------
objc_property_t * class_copyPropertyList(Class cls, unsigned int outCount);
//稍微改动就完成 从字典到模型的转换
unsigned int ountCount =0;
objc_property_t * properties = class_copyPropertyList([AClass class], &ountCount);
for (int i = 0; i<ountCount; i++)
{
objc_property_t property = properties[i];
NSString
propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
NSLog(@"propertyName=:%@",propertyName);
}

10------------------------分割线---------------------------------------
BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types);//又是个重量级的api
Class kclass = [AClass class];
class_addMethod(kclass, @selector(myTest:), (IMP)test, "v@:@");
AClass *aclass = [AClass new];
[aclass performSelector:@selector(myTest:) withObject:@"带过去的参数"];
}
void test(id self, SEL cmd, id value)
{
NSLog(@"value:%@",value);
}
11 ------------------------分割线---------------------------------------
Method class_getInstanceMethod(Class cls, SEL name);//方法调配经常用这个方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理。这种动态语言的...
    有一种再见叫青春阅读 3,723评论 0 3
  • 原文出处:南峰子的技术博客 Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了...
    _烩面_阅读 5,068评论 1 5
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,845评论 0 9
  • 我们常常会听说 Objective-C 是一门动态语言,那么这个「动态」表现在哪呢?我想最主要的表现就是 Obje...
    Ethan_Struggle阅读 6,593评论 0 7
  • 一、前言 OC是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理。即说明OC需要一个编译器和...
    雨润听潮阅读 3,994评论 1 0