- 浏览: 1098472 次
- 性别:
- 来自: 南京
博客专栏
-
Oracle管理和开发
浏览量:352980
最新评论
-
Simon.Ezer:
请问对于“如果非主键字段值发生改变,则不会同步过去”这种情况, ...
创建增量同步Oracle物化视图问题 -
dahai639:
挺好的,支持一下
Oracle的pipelined函数实现高性能大数据处理 -
zealotpz:
不错,原来是用户oracle 的所属组的问题
以sysdba身份登录oracle报ORA-1031权限不足错误之完美分析 -
mikixiyou:
zhangyuslam 写道如果担心全局索引失效,可以使用如下 ...
Oracle分区表的分区交互技术实现数据快速转移 -
sea0108:
...
Oracle sql loader使用速成
在 iOS 中引用计数是内存的管理方式,虽然在 iOS5 版本中,已经支持了自动引用计数管理模式,但理解它的运行方式有助于我们了解程序的运行原理,有助于 debug 程序。
操作系统的内存管理分成堆和栈。
在堆中分配的内存,都试用引用计数模式;在栈中则不是。
NSString 定义的对象是保存在栈中,所以它没有引用计算。看一些书上说它的引用计算会是 fffffffff 最大整数,测试的结果显示它是- 1. 对该对象进行 retain 操作,不好改变它的 retainCount 值。
MutableNSString 定义的对象,需要先分配堆中的内存空间,再初始化才能使用。它是采用引用计数管理内存的。对该对象做 retainCount 操作则每次增加一个。
其实,引用计数是对内存区域的空间管理方式,是应从内存块的视角去看的。任何对象都是指向它的指针,有多少个指针指向它,就有多少个引用计算。
如果没有任何指针指向该内存块了,很明显,该内存块就没有对象引用了,引用计算就是 0, 系统会人为该内存区域已经空闲,于是立即清理,也就是更新一下管理堆的链表中某个标示位。
(miki西游 @mikixiyou 原文 链接: http://mikixiyou.iteye.com/blog/1592958 )
测试方法如下:
在 xcode 中建立一个非 arc 的项目,单视图即可。建立一个按钮的操作方法。
- (IBAction)testRC:(id)sender {
NSInteger i;
i=self.i_test;
if((i%2)==1)
{
NSString * str1=@"welcome";
NSString * str2=@"mlgb";
NSString * str3;
NSString * str4=@"welcome";
NSLog(@"str1 addr is %p",str1);
NSLog(@"str2 addr is %p",str3);
NSLog(@"str3 addr is %p",str3);
NSLog(@"str4 addr is %p",str4);
NSLog(@"str1 retainCount is %i",[str1 retainCount]);
NSLog(@"str2 retainCount is %i",[str2 retainCount]);
//NSLog(@"str3 retainCount is %i",[str3 retainCount]); 该使用会导致 crash ,因为 str3 没有指向任何内存区域。
str3=[str1 retain];
NSLog(@"str3=[str1 retain];");
NSLog(@"str1 retainCount is %i",[str1 retainCount]);
NSLog(@"str3 retainCount is %i",[str3 retainCount]);
str3=[str2 retain];
NSLog(@"str3=[str2 retain];");
NSLog(@"str2 retainCount is %i",[str1 retainCount]);
NSLog(@"str3 retainCount is %i",[str2 retainCount]);
/*
结果如下:
2012-07-14 11:07:38.358 testMem[878:f803] str1 addr is 0x3540
2012-07-14 11:07:38.360 testMem[878:f803] str2 addr is 0x0
2012-07-14 11:07:38.361 testMem[878:f803] str3 addr is 0x0
2012-07-14 11:07:38.362 testMem[878:f803] str4 addr is 0x3540
在栈中,内容相同的对象 str1 和 str4 ,都分配在一个内存区域中,这点是 c 编译器的功能,有利于内存使用和效率。
2012-07-14 11:07:38.363 testMem[878:f803] str1 retainCount is -1
2012-07-14 11:07:38.364 testMem[878:f803] str2 retainCount is -1
2012-07-14 11:07:38.365 testMem[878:f803] str3=[str1 retain];
2012-07-14 11:07:38.366 testMem[878:f803] str1 retainCount is -1
2012-07-14 11:07:38.367 testMem[878:f803] str3 retainCount is -1
2012-07-14 11:07:38.367 testMem[878:f803] str3=[str2 retain];
2012-07-14 11:07:38.368 testMem[878:f803] str2 retainCount is -1
2012-07-14 11:07:38.369 testMem[878:f803] str3 retainCount is -1
*/
}
else
{
NSMutableString * mstr1=[[NSMutableString alloc] initWithString: @"welcome" ];
NSMutableString * mstr2=[[ NSMutableString alloc ] initWithString : @"mlgb" ];
NSMutableString * mstr3;
NSMutableString * mstr4=[[ NSMutableString alloc ] initWithString : @"welcome" ];
NSLog( @"mstr1 addr is %p" ,mstr1);
NSLog( @"mstr2 addr is %p" ,mstr2);
NSLog( @"mstr3 addr is %p" ,mstr3);
NSLog( @"mstr4 addr is %p" ,mstr4);
NSLog( @"mstr1 retainCount is %i" ,[mstr1 retainCount]);
NSLog( @"mstr2 retainCount is %i" ,[mstr2 retainCount]);
//NSLog(@"mstr3 retainCount is %i",[mstr3 retainCount]);
mstr3=[mstr1 retain];
NSLog( @"mstr3=[mstr1 retain];" );
NSLog( @"mstr1 retainCount is %i" ,[mstr1 retainCount]);
NSLog( @"mstr3 retainCount is %i" ,[mstr3 retainCount]);
NSLog( @"mstr3 addr is %p" ,mstr3);
mstr3=[mstr2 retain];
NSLog( @"mstr3=[mstr2 retain];" );
NSLog( @"mstr2 retainCount is %i" ,[mstr1 retainCount]);
NSLog( @"mstr3 retainCount is %i" ,[mstr2 retainCount]);
NSLog( @"mstr3 addr is %p" ,mstr3);
/*
2012-07-14 11:07:36.652 testMem[878:f803] mstr1 addr is 0x68706b0
2012-07-14 11:07:36.655 testMem[878:f803] mstr2 addr is 0x6876040
2012-07-14 11:07:36.656 testMem[878:f803] mstr3 addr is 0x2a35
2012-07-14 11:07:36.657 testMem[878:f803] mstr4 addr is 0x686fbf0
2012-07-14 11:07:36.657 testMem[878:f803] mstr1 retainCount is 1
2012-07-14 11:07:36.658 testMem[878:f803] mstr2 retainCount is 1
2012-07-14 11:07:36.659 testMem[878:f803] mstr3=[mstr1 retain];
2012-07-14 11:07:36.660 testMem[878:f803] mstr1 retainCount is 2
2012-07-14 11:07:36.660 testMem[878:f803] mstr3 retainCount is 2
2012-07-14 11:07:36.661 testMem[878:f803] mstr3 addr is 0x68706b0
2012-07-14 11:07:36.662 testMem[878:f803] mstr3=[mstr2 retain];
2012-07-14 11:07:36.663 testMem[878:f803] mstr2 retainCount is 2
2012-07-14 11:07:36.663 testMem[878:f803] mstr3 retainCount is 2
2012-07-14 11:07:36.664 testMem[878:f803] mstr3 addr is 0x6876040
*/
}
self .i_test= self .i_test+ 1 ;
}
简而言之,引用计数实际上是指向其内存区域的指针数,从内存块的角度去理解,就很容易理解了。
发表评论
-
在storyboard中view的frame值为0
2013-01-23 13:42 9919在XCode4.5中,我使用storyboard创建一个U ... -
使用UIScrollView和UIPageControl显示半透明帮助蒙板
2012-12-31 13:25 0http://www.cnblogs.com/every200 ... -
char,short ,int ,long,long long,unsigned long long数据范围
2012-12-26 14:02 14495编程语言的基础类型速查表 char -128 ~ +12 ... -
关闭ios虚拟键盘的几种方法
2012-12-26 11:17 26456在iOS应用开发中,有三类视图对象会打开虚拟键盘,进行输入操作 ... -
通过segue切换视图控制器
2012-12-21 11:43 3897在使用storyboard开发iOS应用时,从一个视图控制器的 ... -
NSUnknownKeyException
2012-12-20 21:21 0在写测试程序时,出现下面这个exception, ... -
segue分析小结
2012-12-12 10:15 11107在iOS开发中,segue用来实现storyboard中源视图 ... -
http://stackoverflow.com/questions/7301607/tableview-app-terminated-due-to-nsint
2012-12-08 20:36 0http://stackoverflow.com/questi ... -
Delegate分析小结
2012-12-07 17:29 0Delegate的用途: 用于改变或控制其他对象 。 D ... -
Objective-C的内省(Introspection)小结
2012-12-07 17:02 10595内省(Introspection)是面向对象语言和环境的一个强 ... -
UIApplicationDelegate分析小结
2012-12-06 14:52 13699我们开发出来的运行在iOS平台上的应用程序都有一个UIAppl ... -
NSClassFromString和NSStringFromClass
2012-11-30 17:31 0NSClassFromString 将NSString转换成一 ... -
面向对象的最重要思想-间接
2012-11-28 15:20 0面向对象的最重要思想-间接 -
objective-c的实例变量assign和retain
2012-11-01 11:17 0当和objective-c 对象工作时, assig ... -
Objective-C自学进阶书籍
2012-10-30 09:58 0The Objective-C Programming Lan ... -
objective-c数组使用小结
2012-10-17 15:40 3441使用数组对象创建的数组功能非常强大,在Java语言或者C语言中 ... -
NSString对象的初始化和比较
2012-10-17 13:31 3156NSSting的对象在使用@"xx"直接初 ... -
objective-c的对象定义
2012-10-16 14:39 960在objective-c中定义两个类,用于测试对象的定义操作。 ... -
How To Synchronize Core Data with a Web Service
2012-09-03 13:59 0http://www.raywenderlich.com/15 ... -
NSMutableString转换成NSString的N种方法
2012-08-14 10:35 18122NSString是一个不可变的字符串对象。这不是表示这个对象声 ...
相关推荐
在iOS5中,苹果引入了一项重大的内存管理改进——自动引用计数(Automatic Reference Counting,简称ARC)。这项技术简化了开发者对内存管理的需求,使得他们能够更加专注于应用程序的核心逻辑而非繁琐的内存释放...
Objective-C的ARC(Automatic Reference Counting)机制自动处理对象的引用计数,减少了内存管理的负担。 5.5.1)ARC介绍 ARC是在编译时插入适当内存管理代码的机制,确保对象的引用计数正确。 5.5.2)所有权修饰...
它旨在帮助读者深入理解iOS内存管理机制,掌握内存优化方法,从而提升应用性能、稳定性和用户体验。 内存管理是移动应用开发中一个非常重要的方面。在iOS开发中,应用程序的内存使用情况会直接影响到应用的运行效率...
这个原则源于Objective-C中的引用计数内存管理机制,即ARC(Automatic Reference Counting)。在iOS中,对象的生命周期依赖于其他对象对其的引用。当一个对象被创建时,它的引用计数为1,每增加一个强引用,引用计数...
Objective-C 是 iOS 开发中的主要编程语言,其内存管理机制对于优化应用性能和防止内存泄漏至关重要。内存管理主要关注如何有效地分配和释放内存,确保程序的稳定运行。 1. **值类型与引用类型:** - **值类型**...
ARC(Automatic Reference Counting)是苹果引入的一种智能内存管理机制,它自动处理对象的引用计数,大大减轻了开发者手动释放内存的工作。然而,尽管ARC在大多数情况下能够很好地工作,但在某些高级场景下,理解并...
苹果公司提供的Memory Management Programming Guide是一份详尽的指南,它深入解析了iOS系统中的内存管理机制,为开发者提供了宝贵的资源,帮助他们构建性能更佳、资源利用更高效的应用程序。 ### iOS内存管理的...
这是一种编译器自动实现的内存管理机制,它通过跟踪对象的引用计数来自动管理内存。当一个对象的引用计数降至零时,ARC 会自动释放该对象占用的内存,从而避免内存泄漏和过度分配。 Swift 的内存管理机制通过 ARC 为...
这些概念对于理解Objective-C中的内存管理机制至关重要。 首先,我们需要了解iOS内存管理的基本原则,即引用计数(Reference Counting)。每个Objective-C对象都有一个引用计数,记录了有多少个指针指向它。当对象...
ARC则是苹果引入的一种智能内存管理机制,它在编译时自动插入必要的引用计数操作,减少了程序员手动管理内存的负担。理解并熟练掌握这两者,能有效避免常见的内存泄漏问题。 多线程技术则让应用可以在同一时间执行...
iOS高级内存管理编程指南主要介绍了iOS环境下对象的内存管理机制,尤其在Objective-C编程语言中的内存管理方式。在iOS应用开发中,内存管理对于保证应用的稳定运行至关重要。本文将详细介绍iOS内存管理的知识点,...
IOS IPhone 内存管理 IOS IPhone 内存管理是指在 ...IOS IPhone 内存管理机制需要开发者手动管理内存,使用 retain 和 release 机制来避免无效指针,遵守一些规则以使用 autorelease pool,以避免内存泄露和崩溃。
本文主要讨论的是iOS内存管理中的引用计数机制,这是Objective-C和Swift(早期版本)中的一种自动内存管理策略。 引用计数是一种跟踪和管理对象生命周期的方法。简单来说,一个对象的引用计数表示了有多少个指针...
Block是Objective-C中的一种强大的特性,它允许我们将代码块封装为可传递的对象。在iOS和OS X开发中,Block常用于异步操作的回调、...理解Block的实现原理和内存管理机制,对于编写高效、安全的iOS和OS X应用至关重要。
iOS系统采用自动引用计数(Automatic Reference Counting, ARC)作为主要的内存管理机制。ARC负责跟踪对象的所有者,并在适当的时候释放不再使用的内存。理解如何正确使用ARC至关重要,因为它可以避免内存泄漏和过早...
2. **Android和iOS内存管理**:Android和iOS操作系统都有自己的内存管理机制。Android使用Dalvik或ART虚拟机进行内存分配和回收,而iOS则依赖于Objective-C/Swift的自动引用计数(Automatic Reference Counting, ARC)...
在Objective-C中,内存管理主要是通过引用计数(Retain Count)来实现的。当一个对象被创建时,它的引用计数为1;每次使用`retain`方法增加其引用计数,使用`release`方法减少引用计数。当引用计数为0时,该对象会被...
1. **内存管理机制**: iOS采用自动引用计数(ARC)来管理内存,当一个对象的引用计数变为0时,系统会自动释放该对象。然而,如果存在循环引用或者意外的强引用,就会导致内存泄漏。 2. **循环引用**: 循环引用...
在iOS中,自动引用计数(ARC,Automatic Reference Counting)是一种自动管理对象生命周期的机制,它负责跟踪和释放不再使用的对象。然而,尽管ARC极大地简化了内存管理,但仍然可能存在内存泄漏,尤其是由于循环...
Swift 的 ARC 机制通过自动引用计数提供了一种高效且安全的内存管理方式。理解 ARC 的工作原理和正确使用强引用、弱引用和无主引用对于编写高效、稳定且可靠的 Swift 程序至关重要。通过避免循环引用和正确管理闭包...