iOS - 内存管理

内存管理

objective-c提供了第两种内存管理方式:manual retain-release(MRR,手动管理内存)automatic refrence counting (ARC ,自动引用计数)  

 内存管理的目的:

1、  不要释放还或者覆盖还在使用的内存,这样会引起程序崩溃

2、  释放不再使用的内存防止内存泄露

MRC也是基于引用计数的,只是通过开发者手动向某内存块发送消息来改变该内存块的引用计数。

ARC则是编译器代替开发者来完成相应地引用计数。

Objective-c中内存管理的应该遵循的规则:

1、谁创建谁release(包括:allocnewcopy引用计数加1NSArraycopy方法不能视为创建,引用计数不会加1

2、谁想占有某个对象,谁就必须做retain操作

3、谁retain,谁release

4、解决两个对象相互引用的问题:

arc之前,可以一端使用retain,另一端使用assignarc之后,一端使用strong,另一端使用weak

如何判断一个对象的销毁:

重写dealloc方法;

 

类别扩展

类别(GateGory:可以为现有的类添加新方法,而不需要继承。类别中的方法可以被子类继承。类别无法添加实例变量。相当于提供了一些接口,谁使用谁实现。

 

类别的声明:

@interface 类名(类别名)

@end

类别的作用:

1、  为现有的类添加新方法

2、  将类的实现分散到多个不同的文件或不同的框架中(把一个类按功能划分成几块,便于维护)

3、  创建对私有方法的前向应用

4、向对象添加非正式协议

类扩展:是没有类别名的类别。可以有实例变量

@interface 类名()

@end

 

正式协议与非正式协议:

正式协议就是我们通常的协议

非正式协议是使用CateGory来实现的,非正式协议是NSPObject的一个类别,这样任何类的对象都可以作为委托对象来使用,能够列出对象能使用的所有方法。



堆:(1)需要程序员自己管理

      (2)oc中的对象保存在堆中

      (3)内存管理不当造成的两个问题:

           1>内存泄露:不在需要的对象没有释放,导致内存泄露,内存泄露会导致应用闪退。

           2>野指针:正在使用的对象被释放了,导致野指针,访问野指针导致程序崩溃。

      (4)MRC手动内存管理:

           1>引用计数

           一、每一个对象上都有一个引用计数器;

           二、当对象出生的时候引用计数器为1;

           三、当调用对象的retain方法时候计数器+1;

           四、当给对象发送一条release消息的时候,计数器-1;

           五、当一个对象的引用计数为0的时候,这个对象立即被回收;

           2>内存管理原则

           一、谁给一个对象发送alloc,copy,retain消息,就必须在适当时候给这个对象发送相应的release或autorelease消息。

           二、当你需要一个对象的时候就给这个对象的引用器+1,当你不在需要这个对象了,就将这个对象引用计数器-1。

          3>多个对象内存管理

          一、setter方法:

                                1、当设置新对象的时候需要对新对象做一次retain操作;

                                2、当原来的对象不需要了,需要对原来的对象做一次release操作

                                3、如果是同一个对象不需要上面的操作。

         二、dealloc方法:

                               1、当一个对象即将被销毁的时候会调用这个方法;

                               2、它就相当于对象的遗言,在这里释放其成员所占用的内存;

                               3、在释放内存之前首先要调用[super dealloc]

        三、循环引用:

                              1、循环引用的概念:当两个或对个对象间的引用构成一个封闭的环就是循环引用。

                              2、循环引用导致的问题:环中的所有对象都释放不了。

                              3、循环引用的解决方案:有一端必须是assign的。

       四、@property的使用:

             1、内存管理 :(1)基本数据类型使用assign;

                                  (2)普通对象一般使用retain;

                                  (3)NSString及block对象使用copy;

                                  (4)循环引用一端使用strong,一端使用assign;

             2、权限控制:

                                readonly      只读仅生成getter方法;

                                readwrite     读写生成getter方法和setter方法;

             3、线程安全:

                               atomic          线程安全的,会给setter方法加锁,访问速度比较慢

                               noatomic       非线程安全的,不会给setter方法加锁,访问速度快

            4、方法名称定制:

                              setter            定制setter方法名称

                              getter            定制getter方法名称

      五、自动释放池:

          1、作用:延迟对象的释放

          2、原理:自动释放池栈

          3、使用:(1)当你调用autorelease的时候会把该对象放到例你最近的自动释放池中。

                        (2)当执行到自动释放池后面的大括号的时候,自动释放池会出栈,此时会把该栈中的所有的对象做一次release操作。

                        (3)你调用了几次autorelease,当自动释放池被销毁的时候就会调用几次release。

          4、优点:你不必时刻关注对象的释放,让内存管理变的简单

          5、缺点:对象不能及时的得到释放,如果对象占用内存很大,使用它会导致你程序闪退。

          6、使用场景:

                (1)当一个对象很小,使用次数比较少的时候可以使用自动释放。

                (2)当一个对象占用内存比较大的时候不需要使用自动释放出。

                (3)快捷构造方法。

                (4)其他需要延长对象生命周期的地方。

(5)ARC自动引用计数

         一、自动引用计数的概念:他是编译器特性,不是运行时特性;编译器会在适当的时候插入内存管理的代码。

        二、强指针:1、默认所有的指针都是强指针

                          2、只要有强指针指向这个对象,这个对象就不会被销毁。

                          3、只要没有强指针指向这个对象,该对象立即会被销毁。

                          4、关键字:__strong

        三、弱指针:1、弱指针不影响对象的销毁

                          2、关键字:__weak

        四、循环引用:1、循环引用的简介:当多个对象间的引用出现环的时候就是循环引用。

                             2、循环引用的问题:环中的所有对象都是方法释放不了

                             3、解决方案:当出现循环引用的时候,一端必须使用__weak

       五、@property的使用:

             内存管理:1、assign         不参与内存管理,用于基本数据类型

                            2、strong         强引用:用于普通对象

                            3、copy           复制:用于字符串与block

                            4、weak           弱引用:防止循环引用

       六、自动释放池:

              1、通过类方法创建出来的对象都是放在离它最近的方法池中。

              2、当自动释放池销毁的时候才能解除自动释放对该对象的引用。



                                 

栈:(1)内存由系统管理(2)局部变量保存在栈中(3)当变量离开了其所在的代码块就会被回收 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: iOS内存管理版本记录如下: 1. iOS 2.0及更早版本:使用手动管理内存的方式。 2. iOS 3.0:引入了基于引用计数的自动内存管理,使用retain和release函数来增加或减少对象的引用计数。 3. iOS 5.0:引入了ARC(自动引用计数)机制,ARC会在编译时自动插入retain和release代码,减少手动管理内存的工作。 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)来管理对象的生命周期。开发者需要手动调用retain和release方法来增加或减少对象的引用计数,以确保对象在不再需要时能够被正确释放。这种方式需要开发者非常谨慎地管理对象的引用,以避免内存泄漏或野指针等问题。 从iOS 5开始,iOS引入了自动引用计数(Automatic Reference Counting,ARC)的内存管理机制。ARC可以自动地插入retain、release和autorelease等方法的调用,使得开发者不再需要手动进行内存管理。开发者只需要关注对象的创建和使用,而不需要关心具体的内存管理细节。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、付费专栏及课程。

余额充值