
object-c的Retain and Release(保留与释放)
引用计数的管理规则 内存管理原则 合理使用
发布日期:2021-05-15 16:23:58
浏览次数:12
分类:精选文章
本文共 1529 字,大约阅读时间需要 5 分钟。
在Object-C中,系统会自动为每个对象管理引用计数器。每当创建新对象时,初始计数设置为1。为了保持对对象的引用,需要通过调用retain()
方法来增加计数,需要调用release()
方法来减少计数。当计数为0时,系统会自动发送dealloc()
消息释放对象的内存。
代码示例
1. ClassA.h
#import@interface ClassA : NSObject@end
2. ClassA.m
#import "ClassA.h"@implementation ClassA- (void) dealloc { printf("Deallocing ClassA\n"); [super dealloc];}@end
3. main.m
#include#include "ClassA.h"int main(int argc, const char *argv[]) { printf("test case 1:\n"); ClassA *a1 = [[ClassA alloc] init]; ClassA *a2 = [[ClassA alloc] init]; printf("a1 retain count: %i\n", [a1 retainCount]); printf("a2 retain count: %i\n", [a2 retainCount]); printf("test case 2:\n"); [a1 retain]; // 2 [a1 retain]; // 3 [a2 retain]; // 2 printf("a1 retain count: %i\n", [a1 retainCount]); printf("a2 retain count: %i\n", [a2 retainCount]); printf("test case 3:\n"); [a1 release]; // 2 [a2 release]; // 1 printf("a1 retain count: %i\n", [a1 retainCount]); printf("a2 retain count: %i\n", [a2 retainCount]); [a1 release]; // 0 [a2 release]; // 0 printf("Deallocing ClassA\n"); printf("Deallocing ClassA\n"); return 0;}
编译运行
gcc -fconstant-string-class=NSConstantString -c main.m -I /GNUstep/System/Library/Headersgcc -c ClassA.m -I /GNUstep/System/Library/Headersgcc main.o ClassA.o -o main -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base./main.exe
说明
- 每有一个
retain()
,需要一个release()
。 dealloc()
只会被调用一次,释放持有对象的内存。
- 只有由你申请的内存才需你负责释放,不能随意释放他人分配的内存。
retain
和autoRelease
- 在使用
retain()
时,尽量使用autoRelease
来减少留oblinance。
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年04月09日 13时48分40秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
一段强大的shellcode
2019-03-12
双链表相加问题
2019-03-12
GB2312-80 汉字机内码
2019-03-12
n的a进制数
2019-03-12
配置jdk的环境变量
2019-03-12
echo命令的颜色及同行显示控制
2019-03-12
CentOS7利用Systemd添加用户自定义系统服务
2019-03-12
懒人HTML5笔记-1
2019-03-12
两台服务器http方式共享yum软件仓库
2019-03-12
团队背包(team)
2019-03-12
spring tx:advice 和 aop:config 配置事务
2019-03-12
修改layui的后台模板的左侧导航栏可以伸缩
2019-03-12
报错:For input string
2019-03-12
ThreadLocal源码分析解密
2019-03-12
【Java并发编程】并发编程大合集
2019-03-12
编译android源代码(aosp)
2019-03-12
Java流程控制语句
2019-03-12
wincc实现手机APP远程监控
2019-03-12
3.6.X版本的OSG无法打开osgShadow/ShadowVolume的问题
2019-03-12