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

 

posted @ 2015-08-13 17:34  XYQ全哥  阅读(372)  评论(0编辑  收藏  举报