文档章节

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

super_co
 super_co
发布于 2015/06/12 16:30
字数 625
阅读 8
收藏 0

   1、对象拷贝: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

       无疑问打印的内存地址不是一样的,此方法类似指针的深拷贝,

   

  (1)关于对象的深拷贝,浅拷贝还有必要说一下

    <1>深拷贝以及浅拷贝

        浅复制尽复制对象本身,对象里的属性、包含的对象不做复制

        深复制复制全部,包括对象的属性和其他对象

Foundation框架支持复制的类,默认是浅复制

<2>对象的自定义拷贝

对象拥有复制特性,必须实现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

2.更改对象的类/获取对象的类 | Class object_setClass(id obj, Class cls) /  Class object_getClass(id obj)

(1) 更改对象的类

TsetClass *obj1 = [TsetClass new]; 

Class aClass =object_setClass(obj1, [CustomClassOther class]);

(lldb)po obj1

<CustomClassOther: 0x7f8e4bd14480>

(lldb) po aClass

TsetClass

  有没有出乎你的想象0.0.

(2)获取对象的类

TsetClass *obj2 = [TsetClass new];

Class aLogClass =object_getClass(obj2);

(lldb) po aLogClass

TsetClass

   NSString *className = [NSStringstringWithCString:object_getClassName(obj2)encoding:NSUTF8StringEncoding];

        NSLog(@"className:%@", className);

(lldb) po className

TsetClass

3、给一个类添加方法 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:@"我是一个OCmethodC函数实现"];

    NSLog(@"a:%d", a);

   int cfunction(id self, SEL _cmd, NSString *str) {

    NSLog(@"%@", str);

    return 520;//随便返回个值

}

4.获取一个类的所有方法/所有属性

(1)获取一个类的所有方法

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);

    }

5.获取全局变量的值  myFloat 为类的一个属性变量)

float myFloatValue;

   object_getInstanceVariable(self,"myFloat", (void*)&myFloatValue);

   NSLog(@"%f", myFloatValue);

6.设置全局变量的值

 float newValue = 10.00f;

   unsigned int addr = (unsigned int)&newValue;

    object_setInstanceVariable(self,"myFloat", *(float**)addr);


© 著作权归作者所有

共有 人打赏支持
super_co
粉丝 1
博文 10
码字总数 7205
作品 1
东城
高级程序员
iOS 学习资料整理

视频教程(英文) Developing iOS 7 Apps for iPhone and iPad 斯坦福开放教程之一, 课程主要讲解了一些 iOS 开发工具和 API 以及 iOS SDK 的使用, 属于 iOS 基础视频 iPad and iPhone Applic...

拉偶有所依
2015/01/19
2K
4
JavaEE程序员必读图书大推荐

下面是我根据多年的阅读和实践经验,给您推荐的一些图书: 第一部分: Java语言篇 1 《Java编程规范》 星级: 适合对象:初级,中级 介绍:作者James Gosling(Java之父),所以这本书我觉得...

长平狐
2012/11/12
1K
0
程序人生——为什么高级、初级程序员都重要呢?

每个找工作的程序员都必然会遇到这样的招聘贴:寻找“高级程序员”或“初级/入门级程序员”——也许你并没有真正理解这两者之间的区别。与此同时,许多招聘经理可能也不明白其中的区别,他们...

欧阳海阳
07/18
0
0
高级php程序员必会的知识点(一)

PHP作为网络开发的强大语言之一,现在应用非常广泛,具有开放源代码,跨平台性强,开发快捷,效率高,面向对象,并且易于上手,专业专注等诸多优点。 然后很多PHP新手除了的开发外,必须要掌握...

老鸟的天空
08/02
0
0
一个大神开发者的使命感究竟应该是什么

工作了五年的工程师,算不算高级开发者?归类开发者不是简单地看工作年限,因为经验这种东西千金难换但又一文不值。 我们现在工作的行业很奇怪。明明每年都有新的从业人员涌入人才市场,但企...

oschina
2016/03/04
4.6K
24

没有更多内容

加载失败,请刷新页面

加载更多

多线程

1. 多线程概念。并发和并行的概念。 多线程指的是一段时间内cpu同时执行多个线程。一个程序至少运行>=1个进程,进程就是运行中的程序,而一个进程至少运行>=1个线程,线程是操作系统能调度的...

鱼想吃肉
30分钟前
0
0
HBase 表修复在线方式和离线方式

一、在线修复 1.1 使用检查命令 $ ./bin/hbase hbck 该命令可完整修复 HBase 元数据信息;存在有错误信息会进行输出; 也可以通过如下命令查看详细信息: $ ./bin/hbase hbck -details 1.2 ...

Ryan-瑞恩
54分钟前
2
0
redis 系列二 -- 常用命令

1.基础命令 info ping quit save dbsize select flushdb flushall 2.键命令 2.1 set 直接赋值 set a a 2.2 get 取值 get a 2.3 exists 是否存在 exists a 2.4 expire 设置剩余时间 秒 expire......

imbiao
今天
2
0
php foreach

<?php// 数组的引用$a=array(1,2,3,4,5);foreach($a as $key=>&$value){$value=$value*2;}print_r($a);echo " $key -------------------$value\r\n";/** * ...

小张525
今天
3
0
12-利用思维导图梳理JavaSE-多线程

12-利用思维导图梳理JavaSE-多线程 主要内容 1.线程概念 2.线程开发 3.线程的状态 4.线程的同步和死锁 5.Java5.0并发库类 QQ/知识星球/个人WeChat/公众号二维码 本文为原创文章,如果对你有一...

飞鱼说编程
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部