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,如需转载请自行联系原作者
目录
相关文章
|
机器学习/深度学习 API iOS开发
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(一)
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(一)
140 0
|
存储 自然语言处理 Java
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(二)
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(二)
218 0
|
存储 供应链 编译器
玩转 Objective-C 的 Mock 对象
测试驱动开发(TDD)中,开发者经常使用模拟对象进行系统设计,模拟对象到底是什么呢?部分模拟对象和全部模拟对象又是什么呢?模拟对象真的让人又爱又恨吗?让我们以Objective-C测试框架OCMock来探个究竟。
179 0
|
存储 iOS开发
探寻Objective-C引用计数本质
本文涉及到的CPU架构为arm64,其它架构大同小异。 源码来自苹果开源-runtime。 Objective-C中采用引用计数机制来管理内存,在MRC时代,需要我们手动retain和release,在苹果引入ARC后大部分时间我们不用再关心引用计数问题。
1042 0
|
iOS开发 C++
关于Objective-C 对象release操作的一个小问题探讨
来源:http://blog.csdn.net/duxinfeng2010/article/details/8757211 最近遇到这样一个问题,以前的时候并未注意;新建一个工程,然后添加一个类,文件结构是这样的 然后写了这样一小段程序,运行 [cpp] view pl...
654 0