cocoa之高级开发RunTime初级基本变数

cocoa之高级开发RunTime初级基本变数,第1张

概述### 做iOS开发时间也不短了,是时候把自己所见所闻所写的拿出来分享一下了 对象拷贝: 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 @H_403_1@ ### 做iOS开发时间也不短了,是时候把自己所见所闻所写的拿出来分享一下了 对象拷贝:
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初级基本变数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1051650.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存