文档章节

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

super_co
 super_co
发布于 2015/06/12 16:30
字数 625
阅读 9
收藏 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
2.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.7K
24

没有更多内容

加载失败,请刷新页面

加载更多

IC-CAD Methodology企业实战之openlava

在云计算解决安全问题并成为IC界主流运算平台之前,私有的服务器集群系统仍然是各大IC公司的计算资源平台首选。 现在主流的服务器集群管理系统包括lsf,openlava,SkyForm,三者都属于lsf一系...

李艳青1987
19分钟前
0
0
http response stream 字节流 接收与解码

在接收图片、音频、视频的时候,需要用到二进制流。 浏览器会发给客户端 字节Byte流,一串串的发过来_int8格式 -128~127(十进制),也就是8bit(位)。 客户端接收的时候,对接收到的字节收集,...

大灰狼wow
19分钟前
0
0
配置Tomcat监听80端口...

12月13日任务 16.4 配置Tomcat监听80端口 16.5/16.6/16.7 配置Tomcat虚拟主机 16.8 Tomcat日志 1.配置Tomcat监听80端口 示例一:自定义监听端口 vim /usr/local/tomcat/conf/server.xml 编辑...

hhpuppy
19分钟前
0
0
在ubuntu中配置java环境

先在官网下载一个jdk 进入root权限,避免之后出现创建文件失败或者修改文本失败的问题 sudo i 创建一个文件夹来放置jdk解压后的文件 mkdir 文件夹mv jdk1.9(你下载的jdk文件) 你创建 的文...

无极之岚
19分钟前
0
0
程序中设置MySQL的默认值

import com.alibaba.fastjson.JSON;import java.beans.PropertyDescriptor;import java.lang.annotation.*;import java.lang.reflect.Field;import java.lang.reflect.Method;impo......

laolin23
43分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部