c语言模拟实现oc引用计数
#include<stdio.h>
#include<stdlib.h>
//在c中引入 引用计数机制
// 要解决的问题: 1,指向某块动态内存的指针有几个?
// 应该让这块动态内存记录指针的数量
// 所以开辟的动态内存大小应该取多大?
// 如果:c的指针需要开辟n个字节,
// 那么实际上应该开辟n+4个字节
// 假设c中: void *p = xalloc(8)
// 则:实际上在xalloc中应该调:
// int *realp =malloc(12)
// 假设内存如下:
// [_ _ _ _ _ _ _ _ _ _ _ _]
// ^ ^
// | |
// | |
// realp p
//
// 释放过程: xrelease(p)
//这个函数对应oc 的 alloc方法
void * xalloc(int size)
{
int *realp = malloc(size+4);
/**realp=1; */
realp[0]=1;
return realp+1;
}
//对应oc的release方法
void xrelease(void *p)
{
int * realp = (int *)p-1;
if(realp[0]==1 )
{
printf("内存[%p]在被真正释放...\n",p);
free(realp);
}
else
realp[0]--;
}
//对应oc的retain方法
void * xretain(void *p)
{
int * realp = (int *)p-1;
realp[0]++;
return p;
}
//对应oc的 retainCount方法
int xretainCount(void *p)
{
return *((int*)p-1);
}
int main(int argc, char **argv)
{
int *p = xalloc(4); //p指向的内存的计数为: 1
printf("p:[%p]指向的内存的计数为:%d\n",p, xretainCount(p));
int *q = xretain(p);//p指向的内存的计数为: 2
// q = [p retain];
printf("p:[%p]指向的内存的计数为:%d\n", p,xretainCount(p));
xrelease(p); //p指向的内存的计数为: 1
printf("q:[%p]指向的内存的计数为:%d\n",q, xretainCount(q));
xrelease(q); //q指向的内存会被真正释放掉
return 0;
//一个大神写的模拟引用计数机制
}
c语言模拟实现oc引用计数的更多相关文章
- oc引用计数原理-引用计数相关变化
http://blog.csdn.net/null29/article/details/71191044 在 32 位环境下,对象的引用计数都保存在一个外部的表中,每一个对象的 Retain 操作,实 ...
- OC - ARC(自动引用计数)
1.什么是自动引用计数? 顾明思义,自动引用计数(ARC,Automatic Reference Counting)是指内存管理中对引用采取自动计数的技术. 在OC中采用ARC机制,让编译器来进行内存 ...
- OC中的自动引用计数
目录: 1,自动引用计数的定义 2,强引用和弱引用 3,类比手动引用 4,循环引用 5,CoreFoundation 内容: 自动引用计数的定义: (Automatic Reference Count ...
- OC基础15:内存管理和自动引用计数
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.什么是ARC? (1).ARC全名为A ...
- OC中对象元素的引用计数 自动释放池的相关概念
OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念 一.数组对象是如何处理对象元素的引用计数问题[objc] view plaincopy 1. // 2. / ...
- 初步swift语言学习笔记6(ARC-自己主动引用计数,内存管理)
笔者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/31824179 转载请注明出处 假设认为文章对你有所帮助.请通过留言 ...
- C语言的引用计数与对象树
引用计数与对象树 cheungmine 2013-12-28 0 引言 我们经常在C语言中,用指针指向一个对象(Object)的结构,也称为句柄(Handle),利用不透明指针的技术把结构数据封装成对 ...
- 内存管理 垃圾回收 C语言内存分配 垃圾回收3大算法 引用计数3个缺点
小结: 1.垃圾回收的本质:找到并回收不再被使用的内存空间: 2.标记清除方式和复制收集方式的对比: 3.复制收集方式的局部性优点: https://en.wikipedia.org/wiki/C_( ...
- Swift5 语言指南(二十五) 自动引用计数(ARC)
Swift使用自动引用计数(ARC)来跟踪和管理应用程序的内存使用情况.在大多数情况下,这意味着内存管理在Swift中“正常工作”,您不需要自己考虑内存管理.当不再需要这些实例时,ARC会自动释放类实 ...
随机推荐
- 解决matplotlib的中文问题
matplotlib的强大无需我去言说,但它对使用中文的我来说却有一点瑕疵,那就是--在默认状态下,matplotlb无法在图表中使用中文. 在网上查找了一些资料,发现matplotlib本身是支持U ...
- C语言学习004:数组与指针
在C语言中,字符串实际上就是字符数组,在内存中字符串"Shatner"存储的形式是这样的
- .Net语言 APP开发平台——Smobiler学习日志:如何仿微信朋友圈的消息样式?
最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的”Smobil ...
- 【C#】添加引用方式抛出和捕获干净的WebService异常
说明:[干净]指的是客户端在捕获WebService(下称WS)抛出的异常时,得到的ex.Message就是WS方法中抛出的异常消息,不含任何“杂质”. 前提:你对WS有编写权.就是说如果你调的是别人 ...
- 【C#】让ReSharper灰色显示未使用的非私有成员的关键
环境:VS2010+ReSharper8 先说答案: 1.在Inspection Severity中设置Non-private accessibility为Warning.如图: 该页面在ReShar ...
- Tigase集群设置
在两台Linux服务器ddd(IP:10.3.93.212)和tsung213(IP:10.3.93.213)上安装了Tigase,要把这两台服务器组成一个Tigase集群,只需要修改这两台服务器的i ...
- windows上安装使用mySql
一直都使用MSSQL,这两天学习了下Mysql,感觉是这样的--->如果你会MSSQL那么你只需花很少的量时间就能上手MYSQL,如果你会MSSQL,什么MYSQL语法这些对你来说都不是麻烦事了 ...
- 第 15 章 CSS 文本样式[下]
学习要点: 1.文本总汇 2.文本样式 3.文本控制 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS 文本样式,通过文本样式的设置,更改字体的大小.样式以及文本的方位. 一.文本总汇 本节课, ...
- 解析 csv文件 java ***最爱那水货
/** * csv文件解析 <br> * wx 微信明细数据 第1行是标题 ,最后2行 是总结 提取数据需要过滤<br> * zfb 支付宝明细数据 前4行 和最后4行是总结 ...
- 当执行sudo时提示“is not in the sudoers file”的解决方案:
出现这种提示是由于普通用户帐号没有权限执行sudo命令,所以需要切换到root身份进行颁发权限: $su -(注意有- ,这和su是不同的,在用命令"su"的时候只是切换到root ...