ID object_copy(ID obj,size_t size) // 对象释放 ID object_dispose(ID obj)TsetClass *obj = [TsetClassnew];ID objTest =object_copy(obj,sizeof(obj));
(lldb)po &obj
0x00007fff54a7cb08
(lldb)po &objTest
0x00007fff54a7cb00
无疑问打印的内存地址不是一样的,此方法类似指针的深拷贝
浅复制尽复制对象本身,对象里的属性、包含的对象不做复制.
深复制复制全部,包括对象的属性和其他对象.
Foundation框架支持复制的类,默认是浅复制 对象的自定义拷贝
对象拥有复制特性,必须实现NScopying,NSMutablecopying协议,实现该协议的copyWithZone方法和mutablecopyWithZone方法.
深拷贝和浅拷贝的区别就在于copyWithZone方法的实现
object_dispose(objTest);//等价于[objTest release];此方法只是对runtime的封装.
再次执行 [objTest release]都晓得报的什么错误;
List:TestRuntime(1034,0x111b66300) malloc: * error for object 0x7ffe1a75b940: pointer being freed was not allocated
更改对象的类/获取对象的类 更改对象的类TsetClass *obj1 = [TsetClass new]; Class aClass =object_setClass(obj1,[CustomClassOther class]);(lldb)po obj1<CustomClassOther: 0x7f8e4bd14480>(lldb) po aClassTsetClass有没有出乎你的想象0.0.获取对象的类
TsetClass *obj2 = [TsetClass new];Class aLogClass =object_getClass(obj2);(lldb) po aLogClassTsetClassNsstring *classname = [NsstringstringWithCString:object_getClassname(obj2)enCoding:NSUTF8StringEnCoding];NSLog(@"classname:%@",classname);(lldb) po classnameTsetClass给一个类添加方法
BOol class_addMethod(Class cls,SEL name,IMP imp,const char *types)TsetClass *instance = [[TsetClassalloc]init];方法添加class_addMethod([TsetClass class],@selector(ocmethod:),(IMP)cfunction,"i@:@");if ([instance respondsToSelector:@selector(ocmethod:)]) { NSLog(@"Yes,instance respondsToSelector:@selector(ocmethod:)"); } else { NSLog(@"Sorry"); } int a = (int)[instance ocmethod:@"我是一个OC的method,C函数实现"]; NSLog(@"a:%d",a); int cfunction(ID self,SEL _cmd,Nsstring *str) { NSLog(@"%@",str); return 520;//随便返回个值}
获取一个类的所有方法/所有属性
获取一个类的所有方法
u_int count;Method* methods= class_copyMethodList([UIVIEwController class],&count);for (int i = 0; i < count ; i++) { SEL name = method_getname(methods[i]); Nsstring *strname = [Nsstring stringWithCString:sel_getname(name)enCoding:NSUTF8StringEnCoding]; // NSLog(@"%@",strname); }
获取一个类的所有属性
u_int count;objc_property_t *propertIEs=class_copyPropertyList([TsetClass class],&count);for (int i = 0; i < count ; i++) { const char* propertyname =property_getname(propertIEs[i]); Nsstring *strname = [Nsstring stringWithCString:propertyname enCoding:NSUTF8StringEnCoding]; NSLog(@"%@",strname); }获取全局变量的值 (myfloat 为类的一个属性变量)
float myfloatValue;object_getInstanceVariable(self,"myfloat"(voID*)&myfloatValue);NSLog(@"%f",myfloatValue);设置全局变量的值
float newValue = 10.00f;unsigned int addr = (unsigned int)&newValue;object_setInstanceVariable(self,"myfloat",*(float**)addr);总结
以上是内存溢出为你收集整理的cocoa之高级开发RunTime初级基本变数全部内容,希望文章能够帮你解决cocoa之高级开发RunTime初级基本变数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)