Object-C中管理内存

本文详细介绍了Objective-C中对象的保留管理机制,包括如何使用`retain`、`release`方法调整对象引用计数,以及对象如何在计数降至0时自动进行内存回收。通过实例展示了对象创建、保留计数的增减、手动释放对象及其影响。

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;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值