文档章节

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

super_co
 super_co
发布于 2015/06/12 16:30
字数 625
阅读 7
收藏 0
点赞 0
评论 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 ⋅ 4

android开发的学习路线

原文网址链接:http://blog.csdn.net/xujing81/article/details/7313507 第一阶段:Java面向对象编程 1.Java基本数据类型与表达式,分支循环。 2.String和StringBuffer的使用、正则表达式。 ...

数通畅联 ⋅ 2015/03/09 ⋅ 1

JavaEE程序员必读图书大推荐

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

长平狐 ⋅ 2012/11/12 ⋅ 0

干货系列2:看看Java桌面应用开发的职业发展空间与必备技能

导读:    我前面两篇文章分别写了java软件开发和java互联网开发工程师的职业发展和技能要素,今天说一说Java桌面应用开发的程序员,他们一般来说对未来发展尤为困惑,确实,用Java可以创...

半饱即好 ⋅ 2014/05/15 ⋅ 0

一个大神开发者的使命感究竟应该是什么

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

oschina ⋅ 2016/03/04 ⋅ 24

Java程序员的级别定义:对号入座,你在哪个阶段心里要有点数

初级 刚入职场的新人一般都在这个级别了。这一点倒是不区分本科还是硕士,比如我第一家公司硕士毕业进去算初级工程师,本科是[助理工程师]。而公司对于刚毕业的同学的级别定义也是类似,本科...

禁区铁铍人 ⋅ 01/07 ⋅ 0

linux运维进阶之路

运维学习需要分为四个阶段,linux初级入门-àlinux中级进阶-àlinux高级提升,和资深方向细化。   第一阶段:初级入门   初级阶段需要把linux学习路线搞清楚,任何学习都是循序渐进的,所...

俊先生 ⋅ 2017/04/21 ⋅ 0

全栈工程师的学习之路

一、关于全栈工程师的定义与职务 1. 全栈工程师的定义 随着互联网技术的蓬勃发展,技术变得越来越繁琐,越来越多面化。一个项目的开发,需要使用多样技术。举个例子,一个网站的建设,单论初...

JAVA丶学习 ⋅ 2017/12/27 ⋅ 0

linux运维进阶之路

运维学习需要分为四个阶段,linux初级入门-àlinux中级进阶-àlinux高级提升,和资深方向细化。   第一阶段:初级入门   初级阶段需要把linux学习路线搞清楚,任何学习都是循序渐进的,所...

俊先生 ⋅ 2017/04/21 ⋅ 0

干货:从技能角度谈--Java软件开发工程师的自我修养与晋升(B/S结构)(图文详解)

Java软件开发工程师的自我修养与晋升(B/S结构) 絮言: 只要你在一些方面做得好,可能就会有人说你在这方面有天赋。当你听到这样的话时,千万不要当真,因为这很可能是他们在逃避,不愿意正...

半饱即好 ⋅ 2014/05/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从零开始搭建Risc-v Rocket环境---(1)

为了搭建Rocke环境,我买了一个2T的移动硬盘,安装的ubuntu-16.04 LTS版。没有java8,gcc是5.4.0 joe@joe-Inspiron-7460:~$ java -version程序 'java' 已包含在下列软件包中: * default-...

whoisliang ⋅ 8分钟前 ⋅ 0

大数据学习路线(自己制定的,从零开始学习大数据)

大数据已经火了很久了,一直想了解它学习它结果没时间,过年后终于有时间了,了解了一些资料,结合我自己的情况,初步整理了一个学习路线,有问题的希望大神指点。 学习路线 Linux(shell,高并...

董黎明 ⋅ 14分钟前 ⋅ 0

systemd编写服务

一、开机启动 对于那些支持 Systemd 的软件,安装的时候,会自动在/usr/lib/systemd/system目录添加一个配置文件。 如果你想让该软件开机启动,就执行下面的命令(以httpd.service为例)。 ...

勇敢的飞石 ⋅ 16分钟前 ⋅ 0

mysql 基本sql

CREATE TABLE `BBB_build_info` ( `community_id` varchar(50) NOT NULL COMMENT '小区ID', `layer` int(11) NOT NULL COMMENT '地址层数', `id` int(11) NOT NULL COMMENT '地址id', `full_......

zaolonglei ⋅ 24分钟前 ⋅ 0

安装chrome的vue插件

参看文档:https://www.cnblogs.com/yulingjia/p/7904138.html

xiaoge2016 ⋅ 27分钟前 ⋅ 0

用SQL命令查看Mysql数据库大小

要想知道每个数据库的大小的话,步骤如下: 1、进入information_schema 数据库(存放了其他的数据库的信息) use information_schema; 2、查询所有数据的大小: select concat(round(sum(da...

源哥L ⋅ 49分钟前 ⋅ 0

两个小实验简单介绍@Scope("prototype")

实验一 首先有如下代码(其中@RestController的作用相当于@Controller+@Responsebody,可忽略) @RestController//@Scope("prototype")public class TestController { @RequestMap...

kalnkaya ⋅ 54分钟前 ⋅ 0

php-fpm的pool&php-fpm慢执行日志&open_basedir&php-fpm进程管理

12.21 php-fpm的pool pool是PHP-fpm的资源池,如果多个站点共用一个pool,则可能造成资源池中的资源耗尽,最终访问网站时出现502。 为了解决上述问题,我们可以配置多个pool,不同的站点使用...

影夜Linux ⋅ 今天 ⋅ 0

微服务 WildFly Swarm 管理

Expose Application Metrics and Information 要公开关于我们的微服务的有用信息,我们需要做的就是将监视器模块添加到我们的pom.xml中: 这将使在管理和监视功能得到实现。从监控角度来看,...

woshixin ⋅ 今天 ⋅ 0

java连接 mongo伪集群部署遇到的坑

部署mongo伪集群 #创建mongo数据存放文件地址mkdir -p /usr/local/config1/datamkdir -p /usr/local/config2/data mkdir -p /usr/local/config3/data mkdir -p /usr/local/config1/l......

努力爬坑人 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部