Objective-C:MRC(引用计数器)获得对象所有权的方式(init、retain、copy等)
.h声明文件
1 // Integer.h 2 // 02-MRC 3 // 4 // Created by ma c on 15/8/13. 5 // Copyright (c) 2015年. All rights reserved. 6 // 7 8 #import <Foundation/Foundation.h> 9 10 @interface Integer : NSObject 11 @property(nonatomic,assign)NSInteger i; 12 -(id)initWithI:(NSInteger) i; 13 -(void) print; 14 +(Integer *)integerWithIntger:(NSInteger) i; 15 @end
.m实现文件
1 // Integer.m 2 // 02-MRC 3 // 4 // Created by ma c on 15/8/13. 5 // Copyright (c) 2015年. All rights reserved. 6 // 7 8 #import "Integer.h" 9 10 @implementation Integer 11 -(id)initWithI:(NSInteger) i 12 { 13 self = [super init]; 14 if(self) 15 { 16 _i = i; 17 } 18 return self; 19 } 20 +(Integer *)integerWithIntger:(NSInteger) i 21 { 22 return [[Integer alloc]initWithI:i]; 23 } 24 25 -(void) print 26 { 27 NSLog(@"i = %ld",_i); 28 } 29 -(void)dealloc 30 { 31 NSLog(@"integer dealloc"); 32 [super dealloc]; 33 } 34 @end
主函数测试
1 // main.m 2 // 02-MRC 3 // 4 // Created by ma c on 15/8/13. 5 // Copyright (c) 2015年. All rights reserved. 6 // 7 8 #import <Foundation/Foundation.h> 9 #import "Integer.h" 10 int main(int argc, const char * argv[]) 11 { 12 @autoreleasepool 13 { 14 //测试手动引用计数 15 //1.创建对象会获得对象所有权 16 Integer *i1 = [[Integer alloc]initWithI:10]; 17 NSLog(@"retaincount = %lu",[i1 retainCount]);//1 18 19 20 //2.只通过指针赋值,不会获得对象所有权 21 Integer *i2 = i1; 22 NSLog(@"retaincount = %lu",[i2 retainCount]);//1 23 24 25 //3.通过retain会获得对象的所有权 26 [i1 retain]; 27 NSLog(@"retaincount = %lu",[i1 retainCount]);//2 28 29 30 //4.将对象添加到容器中,容器中会存储对象的一个引用,会获得对象所有权 31 NSMutableArray *array = [NSMutableArray array]; 32 [array addObject:i1]; 33 NSLog(@"retaincount = %lu",[i1 retainCount]);//3 34 35 36 //5.通过release释放对象的所有权 37 [i1 release]; 38 NSLog(@"retaincount = %lu",[i1 retainCount]);//2 39 40 41 //6.从容器中删除对象,也会释放对象所有权 42 [array removeObject:i1]; 43 NSLog(@"retaincount = %lu",[i1 retainCount]);//1 44 45 //7.最后再释放一次,对象才会被正常销毁 46 [i1 release]; //此时,底层会调用dealloc方法 //0 47 } 48 return 0; 49 }
测试结果是:
2015-08-13 17:32:36.408 02-MRC[1599:103515] retaincount = 1 2015-08-13 17:32:36.409 02-MRC[1599:103515] retaincount = 1 2015-08-13 17:32:36.410 02-MRC[1599:103515] retaincount = 2 2015-08-13 17:32:36.410 02-MRC[1599:103515] retaincount = 3 2015-08-13 17:32:36.410 02-MRC[1599:103515] retaincount = 2 2015-08-13 17:32:36.410 02-MRC[1599:103515] retaincount = 1 2015-08-13 17:32:36.410 02-MRC[1599:103515] integer dealloc Program ended with exit code: 0
程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!