Object-C中管理内存

本文介绍了Objective-C中的内存管理机制,包括对象的保留计数、手动增加或减少保留计数的方法,以及自动释放池的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Object-C之中采用一种保留记录的方式记录我们所创建的所有的对象,并且,当该计数减少为0的时候,Object-C自动收回分配给一个对象的内存。

Text *text1 = [[Text alloc]init]; Text *text2 = [[Text alloc]init];
每一个对象的计数都为1,我们可以通过retainCount方法对其进行输出,如

printf("text1 retain count is %d",[text1 retainCount]);
retain为增加保留计数的方法,可以直接显式的进行调用

[text1 retain];
例:retaincount.m

#import <Foundation/Foundation.h> #import <stdio.h> @interface Class1:NSObject @end @implementation Class1 @end int main(void) { Class1 *object1 = [[Class1 alloc]init]; Class1 *object2 = [[Class1 alloc]init]; printf("object1 retain count:%i\n",[object1 retainCount]); printf("object2 retain count:%i\n",[object2 retainCount]); return 0; }结果为
object1 retain count:1 object2 retain count:1
其中我们可以通过手动的增加或者减少保留计数来对对象进行管理
例:incrementcount.m

#import <Foundation/Foundation.h> #import <stdio.h> @interface Class1:NSObject @end @implementation Class1 @end int main(void) { Class1 *object1 = [[Class1 alloc]init]; Class1 *object2 = [[Class1 alloc]init]; printf("object1 retain count:%i\n",[object1 retainCount]); printf("object2 retain count:%i\n",[object2 retainCount]); [object1 retain]; [object1 retain]; [object2 retain]; printf("object1 retain count:%i\n",[object1 retainCount]); printf("object2 retain count:%i\n",[object2 retainCount]); return 0; }
结果为

object1 retain count:1 object2 retain count:1 object1 retain count:3 object2 retian count:2

例:decrementcount.m

#import <Foundation/Foundation.h> #import <stdio.h> @interface Class1:NSObject @end @implementation Class1 @end int main(void) { Class1 *object1 = [[Class1 alloc]init]; Class1 *object2 = [[Class1 alloc]init]; printf("object1 retain count:%i\n",[object1 retainCount]); printf("object2 retain count:%i\n",[object2 retainCount]); [object1 retain]; [object1 retain]; [object2 retain]; printf("object1 retain count:%i\n",[object1 retainCount]); printf("object2 retain count:%i\n",[object2 retainCount]); [object1 release]; [object2 release]; printf("object1 retain count:%i\n",[object1 retainCount]); printf("objcet2 retian count:%i\n",[object2 retainCount]); return 0; }
结果为

object1 retain count:1 object2 retain count:1 object1 retain count:3 object2 retian count:2 object1 retain count:2 object2 retain count:1
当对象的保留技术达到0的时候,object-c从内存中收回对象
例:dealloc.m

#import <Foundation/Foundation.h> #import <stdio.h> @interface Class1:NSObject @end @implementation Class1 @end int main(void) { Class1 *object1 = [[Class1 alloc]init]; Class1 *object2 = [[Class1 alloc]init]; printf("object1 retain count:%i\n",[object1 retainCount]); printf("object2 retain count:%i\n",[object2 retainCount]); [object1 retain]; [object1 retain]; [object2 retain]; printf("object1 retain count:%i\n",[object1 retainCount]); printf("object2 retain count:%i\n",[object2 retainCount]); [object1 release]; [object2 release]; printf("object1 retain count:%i\n",[object1 retainCount]); printf("objcet2 retian count:%i\n",[object2 retainCount]); [object1 release]; [object1 release]; [object2 release]; return 0; }
结果为

object1 retain count:1 object2 retain count:1 object1 retain count:3 object2 retian count:2 object1 retain count:2 object2 retain count:1 Deallocing the object Deallocing the object

object中还存在着自动释放池的概念,对于不是使用alloc或new创建的对象,我们可以让object-c使用自动释放池管理。

简单的说,就是如果创建一个对象,那么再释放对象的时候,对象中的所有属性也会同时一并被释放。

#import <Foundation/Foundation.h> #import <stdio.h> int main() { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; NSString *string1 = [NSString stringWithString:@"Pool-managed string"]; printf("%s's retain count:%x\n",[string1 cString], [string1 retainCount]); [pool release]; return 0; }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值