NSArray是强引用容器
经常比较疑惑NSArray、NSDictionary、NSSet这几个对象容器管理对象所采用的方式是“强引用”还是“弱引用”。
通过简单的命令行程序得到的结论是“NSArray、NSDictionary、NSSet这几个容器都是强引用容器”。
打开Xcode,新建project,选择“OS X”-“Application”-“Command Line Tool”,完成project的创建,默认情况下,project会使用ARC,这里不需要使用ARC,所以还需要在project配置文件中将ARC取消。容易在“PROJECT”-“Build Settings”-“Apple LLVM 6.0 - Language - Objective C”中找到“Objective-C Automatic Reference Counting”这一项,选择为“No”即可。
话不多说,开始。
创建一个类Person,该类定义很简单,只有一个name属性:
@interface Person : NSObject @property (nonatomic, retain) NSString *name; @end
main.m文件代码如下:
int main(int argc, const char * argv[]) { Person *person = [[Person alloc] init];
person.name = @"Jason"; NSLog(@"(1). Object Reference Count = %lu, name=%@",
[person retainCount], person.name);
// output: (1). Object Reference Count = 1, name=Jason NSArray *array = @[person];
NSLog(@"(2). Object Reference Count = %lu, name=%@",
[person retainCount], person.name);
// output: (2). Object Reference Count = 2, name=Jason [array release];
NSLog(@"(3). Object Reference Count = %lu, name=%@",
[person retainCount], person.name);
// output: (3). Object Reference Count = 1, name=Jason [person release];
NSLog(@"(4). Object Reference Count = %lu, name=%@",
[person retainCount], person.name);
// output: (4). Object Reference Count = 1, name=Jason return ;
}
刚开始对output(4)的输出非常不理解,有两个疑点:
[person release]
之后person对象应该不存在了,为什么其reference count为1而不是0呢?- person不是被released了吗,为什么还能访问器name属性?
对于第一个问题,读了唐巧的《iOS开发进阶》,得出的答案是:
因为该对象已经被回收,而我们向一个被回收的对象发了一个retainCount消息,所以它的输出结果应该是不确定的。那为什么在这个对象被回收之后,这个不确定的值是1而不是0呢?这是因为当最后一次执行release时,系统知道马上就要回收内存了,就没有必要再将retainCount减1了,因为不管减不减1,该对象肯定会被回收,而对象被回收后,它的所有内存区域,包括retainCount值也变得没有意义了。不将这个值从1变为0,可以减少一次内存的操作,加速对象的回收。
对于第二个问题,还没有找到比较权威的解释,以后再来回到吧。
总之,搞清楚了“NSArray、NSDictionary以及NSSet都是强引用容器”这个事实。
NSArray是强引用容器的更多相关文章
- Java 对象引用方式 —— 强引用、软引用、弱引用和虚引用
Java中负责内存回收的是JVM.通过JVM回收内存,我们不需要像使用C语音开发那样操心内存的使用,但是正因为不用操心内存的时候,也会导致在内存回收方面存在不够灵活的问题.为了解决内存操作不灵活的问题 ...
- java强引用、软引用、弱引用、虚引用
前言概述 在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象.这就像在日常生活中,从商店购买了某样物品后,如果有用,就一直保留它,否则就把它扔到垃圾箱,由清洁工人收走 ...
- .NET 强引用与弱引用
强引用 如果应用程序的代码可以访问一个正由该程序使用的对象,垃圾回收器就不能收集该对象, 那么,就认为应用程序对该对象具有强引用. 要建立强引用并重新使用该对象,请将 WeakRe ...
- ios - NSTimer中target的self是强引用问题
当控制器ViewController跳转进入控制器OneViewController中的时候开启定时器,让定时器每隔一段时间打印一次,当OneViewController dismiss的时候,控制器 ...
- 【转载】 Java 7之基础 - 强引用、弱引用、软引用、虚引用
原文地址:http://blog.csdn.net/mazhimazh/article/details/19752475 1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一 ...
- Java中的引用类型(强引用、弱引用)和垃圾回收
Java中的引用类型和垃圾回收 强引用Strong References 强引用是最常见的引用: 比如: StringBuffer buffer = new StringBuffer(); 创建了一个 ...
- 弱引用?强引用?未持有?额滴神啊-- Swift 引用计数指导
ARC ARC 苹果版本的自动内存管理的编译时间特性.它代表了自动引用计数(Automatic Reference Counting).也就是对于一个对象来说,只有在引用计数为0的情况下内存才会被释放 ...
- .NET 强引用和弱引用
一:什么是弱引用 了解弱引用之前,先了解一下什么是强引用 例如 : Object obj=new Object(); 就是一个强引用,内存分配一份空间给用以存储Object数据,这块内存有一个 ...
- Java四种引用包括强引用,软引用,弱引用,虚引用。
Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Object obj = new Object();//可直接通过obj取得对应的对象 如obj.e ...
随机推荐
- 最小费用最大流粗解 poj2516
最小费用最大流,一般解法如下: 在流量基础上,每条边还有权费用,即单位流量下的所需费用.在最大流量下,求最小费用.解法:在最大流算法基础上,每次按可行流增广改为每次用spfa按最小费用(用单位费用)增 ...
- 深入探究Java中hashCode()和equals()的关系
目录 一.基础:hashCode() 和 equals() 简介 equals() hashCode() 二. 漫谈:初识 hashCode() 与 equals() 之间的关系 三. 解密:深入理解 ...
- 《深入理解mybatis原理》 MyBatis缓存机制的设计与实现
本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存机制中的方方面面展开讨论. MyBatis将数据缓存设计成两级结构,分为一级缓存 ...
- 批量修改WORD表格属性
有时候需要对word中很多表格的属性进行修改,而word无法批量修改属性,所有这里记录一个宏 Sub TableFormatter() Dim oTbl As Table, i As Integer ...
- How do I get an image from an UIButton? 如何获取uibutton设置的uiimage
UIImage*img =[button imageForState:UIControlStateNormal];
- JS---数组(Array)处理函数整理
1.concat() 连接两个或更多的数组该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本.例如: 代码如下: <script type="text/javascript&q ...
- grafana结合influxdb、open-falcon出图配置
1.https://www.jianshu.com/p/fadcf4d92b0e 2.https://www.jianshu.com/p/21ce6ee143f3 3.http://www.super ...
- iOS开发 当前时间 时间戳 转换
1.今天在做一个webservice的接口的时候,被要求传一个时间戳过去,然后就是开始在Google上找 2.遇到两个问题,一,当前时间转化为时间戳,二,获取的当前时间和系统的时间相差8个小时 一,转 ...
- centos6.3升级python至2.7.5
centos6.3自带的python版本是2.6.6,有时候需要升级到2.7.这里记录一下升级过程,方便查阅.实际上是转载自http://flyingdutchman.iteye.com/blog/1 ...
- BMP文件格式具体解释
BMP文件格式具体解释(BMP file format) BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统 ...