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

被折叠的 条评论
为什么被折叠?



