Objective-C:MRC(引用计数器)获得对象所有权的方式(init、retain、copy等)-阿里云开发者社区

开发者社区> 开发与运维> 正文

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
复制代码

 

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!


本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4727984.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章