对iOS中内存处理的一些理解(retain,copy,assain,release,autorelease)

众所周知,iOS对内存的处理是很出色的,正因为它对内存的处理优化非常好,所以在有限的内存下系统运行的流畅性一直很不错。这里就对编程中对iOS里的retain,copy,assain,release,autorelease说一下我的个人理解。

assign就是直接赋值,当数据为基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char)时,可以使用assign。

retain只能用于Objective-C对象类型,因为retain会增加对象的引用计数,而基本数据类型或者Core Foundation对象都没有引用计数。每当引用一次,引用计数加一。release后,引用计数减一。当引用计数为0时,对象所占内存被释放。

我们在h文件中经常这样写:@property (retain, nonatomic) XXX 其实就已经引用了一次了,这时即使你对这个对象什么都不做。它的引用计数已经是1了。所以我们要在dealloc函数中把这个对象release掉,把它的引用计数变成0,让他释放掉内存,对于许多iOS初学者来说,总是忘记release。这样的话会造成内存泄露。当我们想对这个对象处理的时候。比如对它alloc,这时引用计数也+1,一定要对它release或autorelease。这时一一对应的。

比如:@property (retainnonatomic) NSString* a;

            @property (retainnonatomic) NSString* b;

             a = @"aaa";

             b = a;

            a和b这里实际上都是指针,a和b都指向了同一块内存 "aaa"。这时a和b的引用计数是1。当我们把a给release的时候,a的引用计数为0。是不是应该把它所指向的内存“aaa”也释放掉呢?这肯定是不行的,因为我不知道b还用不用。如果把内存释放了的话,当调用b的时候岂不是会crash。没错,系统也是这么做的,内存并没有被释放,那系统怎么判断呢?判断b的引用计数,好的,为1,不释放,只有a和b的引用计数都为0时,才释放这块内存。

注意:把对象添加到数组中时,引用计数将增加对象的引用计数+1。

copy是内容复制,当使用了copy时,是有2个内容相同的内容,占的却是2个不同的内存地址。


release与autorelease

release是手动释放,由程序员手动控制。autorelease是自动释放,由系统控制。

如果你能够真正的理解autorelease那么你才是理解了Objective c存管理。Autorelease实际上只是把release用延了,于每一个Autorelease系统只是把Object放入了前的Autorelease pool中,当该poolpool中的所有Object会被Release

在项目中,会有一个默认的Autorelease pool,程序开始时创建,程序退出时销毁,按照对Autorelease的理解,岂不是所有autorelease pool里的对象在程序退出时才release,这样跟内存泄露有什么区别?

实际上,对于每一个Runloop,系统会隐式创建一个Autorelease pool。这样所有的release pool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。

那什么是一个Runloop呢? 一个UI事件,Timer call, delegate call, 都会是一个新的Runloop。

这里,我推荐多使用autorelease。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: iOS内存管理版本记录如下: 1. iOS 2.0及更早版本:使用手动管理内存的方式。 2. iOS 3.0:引入了基于引用计数的自动内存管理,使用retainrelease函数来增加或减少对象的引用计数。 3. iOS 5.0:引入了ARC(自动引用计数)机制,ARC会在编译时自动插入retainrelease代码,减少手动管理内存的工作。 4. iOS 7.0:引入了内存诊断工具Memory Usage Report,可以监测App内存使用情况,帮助开发者优化内存管理。 5. iOS 8.0:引入了一些新的API,如NSCache和NSURLSession,使得内存管理更加方便和灵活。 6. iOS 11.0:引入了基于图片大小的UIImage渲染机制,减少了内存占用。 7. iOS 13.0:引入了叫做“Scene”的多任务环境,使得内存管理更加复杂,需要更加小心谨慎地处理内存问题。 总的来说,随着iOS版本的不断更新,内存管理的机制也在不断地完善和优化,使得iOS应用能够更加高效地使用内存,提高用户体验。 ### 回答2: iOS内存管理是由操作系统自动管理的,在不同的版本有所不同。 在iOS 5之前的版本内存管理主要依赖于手动管理引用计数(reference counting)来管理对象的生命周期。开发者需要手动调用retainrelease方法来增加或减少对象的引用计数,以确保对象在不再需要时能够被正确释放。这种方式需要开发者非常谨慎地管理对象的引用,以避免内存泄漏或野指针等问题。 从iOS 5开始,iOS引入了自动引用计数(Automatic Reference Counting,ARC)的内存管理机制。ARC可以自动地插入retainreleaseautorelease等方法的调用,使得开发者不再需要手动进行内存管理。开发者只需要关注对象的创建和使用,而不需要关心具体的内存管理细节。ARC减少了内存管理的工作量,提高了开发效率,并且减少了内存泄漏和野指针等问题的发生。不过,ARC并不是完全的自动化内存管理,开发者仍然需要遵循一些规则,比如避免循环引用等,以保证内存的正确释放。 随着iOS版本的不断更新,苹果不断改进和优化内存管理机制。每个新版本都带来了更好的性能和更高效的内存管理。开发者可以通过关注苹果的官方文档和开发者社区的更新内容来了解每个版本的具体变化和改进。 总结来说,iOS内存管理从手动的引用计数到自动引用计数的演变,极大地简化了开发者的工作,并提高了应用的性能和稳定性。随着不断的改进和优化,iOS内存管理会越来越高效和可靠。 ### 回答3: iOS内存管理版本记录是指苹果公司在不同版本的iOS操作系统对于内存管理方面的改进和更新记录。随着iOS版本的不断迭代,苹果在内存管理方面进行了一系列的优化和改进,以提高系统的稳定性和性能。 首先,在早期的iOS版本,苹果采用了手动内存管理的方式,即开发人员需要手动创建和释放内存,容易出现内存泄漏和内存溢出等问题。为了解决这些问题,苹果在iOS5版本引入了自动引用计数(ARC)机制。ARC机制能够通过编译器自动生成内存管理代码,避免了手动管理内存带来的问题。 其次,iOS6版本引入了内存分页机制。这个机制能够将应用程序内存分成不同的页,将不常用的页置于闲置列表,从而释放出更多的内存空间。这些闲置列表的页能够在需要时快速恢复到内存,减少了内存压力。 此外,iOS7版本进一步提升了内存管理的能力。苹果在这个版本引入了内存压缩技术,将内存的数据进行压缩,从而提高了内存利用率。此外,iOS7还引入了资源清理功能,可以自动清理不再使用的资源,释放内存空间。 最后,在iOS13版本,苹果进一步改进了内存管理策略。该版本引入了后台内存优化功能,能够自动优化应用在后台运行时的内存占用,减少了后台应用对于系统内存的占用和影响。 综上所述,iOS内存管理版本记录反映了苹果在不同版本的iOS操作系统对于内存管理方面的改进和优化。这些改进和优化使得iOS系统更加稳定和高效,并且提升了应用程序的性能和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值