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