Working with Classes

2017-05-05  本文已影响0人  事件_666

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);//方法调配经常用这个方法

上一篇 下一篇

猜你喜欢

热点阅读