OC第七节——内存管理

戏言:

iOS开发已经到了一个ARC时代,一般不需要我们过多的去关注内存是怎么分配,怎么管理的。很长一段时间,我也不知道内存管理是什么鬼,但如果遇到这方面的问题,却找不到解决办法确实很头疼的。So,还是静下心来,好好学习吧,毕竟内功才是体现水平。

1. 引用计数
            对于一块动态申请的内存,有一个人(指针)使用,就给这个内存的计数器加1,使用完成后,就给这个计数器减1,当这个内存的引用计数为0了,我们再释放他,这样,上面的问题就解决了。OC,就是使用引用计数这种方式来管理内存的。

生动的理解就是:举一个生活中的例子,我们一起去水库边烧烤,我把火点着了,当我们正在“水深火热”的烤着肉,一个电话来了,媳妇让我回家。于是,我跟你们说,你们懂的,哥要回去了,为了防止引发火灾,我要把火扑灭了。我相信,此时你们打死我的心都有。
        我们能不能想到更好的方法,我不浇灭火,又不会引起火灾?
        计数,虽然火是我生的,但我们有10个人一起用。那么,这堆火的计数为10,如果我,或者任何一个同学走了,让计数减1,变成9,8,7...这样,直到最后一个同学走,他在走之前将火灭了就好了。            这就是OC的内存管理方式,引用计数。

2.内存管理的黄金法则
            对于引用计数来说,有一套内存管理的黄金法则:
            The basic rule to apply is everything that increases the reference counter with alloc, [mutable]copy[withZone:] or retain is in charge of the corresponding [auto]release.
         只要使用了alloc/retain/copy/mutableCopy, 创建了对象
    那么就必须使用release进行释放,
        ———谁创建,谁负责释放

3.retain与retainCount
        retain,将对象进项保留操作,也就是使对象的引用计数加1。
        retainCount,打印一个对象的引用计数。


       DSDog*dog=[[DSDog alloc]init];
        NSLog(@"%lu",[dog retainCount]);//1 含有init,引用计数加1
        DSDog *dog2=[dog retain];

        NSLog(@"%lu",[dog2 retainCount]);//2  对象retain,引用计数加1
        [dog2 release];
        NSLog(@"%lu",[dog2 retainCount]);//1  release,引用计数减1
        [dog release];   // 变为0 ,销毁对象

4.MRC和ARC
            ARC   (Automatic Reference Counting),自动引用计数,由xcode,帮我们去管理内存。
            MRC  (Manual  Reference Counting),手动引用计数,我们手动管理内存。

Xcode 5.0  以后的版本默认是ARC模式

工程创建的时候是ARC的,我们如果想要MRC,需要进行如下设置。
            选中工程 - target - Bulid Settings - 搜索:automatic reference counting或auto,将Objective-C Automatic Reference Counting改为NO。

[email protected] retain,assign,copy展开

[email protected] (nonatomic, retain) DSDog *dog; 用来修饰ObjC对象。

则会展开如下:
       - (void)setDog:(DSDog *)dog
        {
                if (_dog != dog)
                {
                        [_dog release];
                        _dog = [dog retain];
                }
        }
5.2 assign展开:简单数据类型

@property (nonatomic, assign) DSDog *dog;

assign是直接复制,则会展开如下:
    //简单数据类型 ,OC的内存管理对于简单的数据类型 int\float…, OC无效
    - (void)setDog:(DSDog *)dog
    {
        _dog = dog;
    }

5.3 copy展开  , 复制一份原来的对象

//copy 多用于字符串,Dict、Array
    @property (nonatomic, copy)NSString *name;
    - (void)setName:(NSString *)name
    {
        if (_name != name)
        {
            [_name release];
            _name = [name copy];
        }
    }
6.自动释放池

原理:对象接收到autorelease消息时,它会被添加到了当前的自动释放池中,当自动释放池被销毁时,会給池里所有的对象发送release消息。

ObjC提供两种方法创建自动释放池:
  方法一:使用NSAutoreleasePool来创建

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc]init];
     //这里写代码
     [pool release];方法二:使用@autoreleasepool创建
  @autoreleasepool {
     //这里写代码
     }

7.weak:ARC新引入修饰词,可代替assign,比assign多增加一个特性
strong:ARC新引入修饰词,可代替retain
 
时间: 2024-10-09 23:56:24

OC第七节——内存管理的相关文章

OC基础 05-手动内存管理(MRC)

---恢复内容开始--- MRC: Manul(手动) Reference(引用) Counting(计数) 什么是手动引用计数? 所有对象的内容都需要我们手动管理, 需要程序员自己编写release/retain等代码 内存管理的原则就是有加就有减 也就是说, 一次alloc/new/copy对应一次release, 一次retain对应一次relese 内存管理的重要性: 移动设备的内存极其有限,每个app的占用内存也是有限制的. 当我们创建一个OC对象,定义一个变量,调用一个函数或者方法,

七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 [email protected]参数 [email protected]和循环retain的使用 6.NSString的内存管理

1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程序闪退. 2.OC内存管理的范围 : 管理任何继承NSObject的对象,对其他的基本数据类型无效. 3.对象类型是程序运行过程中动态分配的,存储在堆区:内存管理主要是对 堆区中的对象的内存管理. 4.OC内存管理的原理 为了防止内存泄露 对象的引用计数器 : 每个OC对象都有自己的引用计数器,是一

黑马程序员---OC基础6【内存管理】【手动内存管理】【单、多个对象的内存管理】【*@property参数】【@class的使用】【NSString类的内存管理】【autorelease使用】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [内存管理] 1.内存管理概念 由于移动设备内存及其有限,所以每个app所占的内存也是有限的 需要回收一些不使用的空间 2.OC内存管理的范围 管理任何继承NSOject的对象,对其他的基本数据类型无效 主要管理堆区中的对象的内存管理   3.内存管理的原理 1)对象所有权概念 任何对象都可以能拥有一个或多个所有者,只要一个对象至少还拥有一个所有者,他就会继续存在 cocoasu所有权策略 任何自

OC加强(一)之内存管理

1.为什么要进行内存管理? 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存 较多时,系统就会发出内存警告,一个app可用的内存是被限制的,如果一个app使用的内存超 过20M,则系统会向该app发送Memory Warning消息.收到此消息后,需要回收一些不需要再 继续使用的内存空间,比如回收一些不再使用的对象和变量等,否则程序会崩溃. 这里首先要解释一个常识概念:内存,存储空间,各自的功能? 内存:我们一般说的手机内存其实是指运行内存,,简称运存,即 

OC学习总结4 内存管理

内存管理 基本数据类型(int,float,double,char,struct,enum)的数据内存不需要内存管理 1 对象的内存管理 诞生 alloc或new或copy 生存 接收消息和执行操作 交友 借助方法的组合和参数,调用方法 销毁 内存被释放 delloc:相当于被释放内存的临终遗言,每个内存被销毁之前都会调用dealloc方法 2 引用计数 1 Cocoa采用引用计数也叫作保留计数 2 alloc new copy 用这三个方法创建对象时,对象的引用计数器为1 3 retain 给

23-黑马程序员------OC 语言学习笔记---内存管理

黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 对于面向对象的变成语言,程序需要不断地创建对象.初始,创建的所有程序通常都有指针指向它,程序可能需要访问这些对象的实例变量或调用这些对象的方法,随着程序的不断执行,程序再次创建了一些新的对象,而那些老的对象已经不会再被调用,也不

OC系列高级-内存管理关键字

一.MRC中@property关键字 1.assign,retain,copy 这几个关键字用语setter方法的内存管理 assign:一般用于非oc对象,直接自信赋值操作 retain:一般用于oc对象,那么将retain新值,release旧值 copy:将release旧值,copy新值 一般默认是assign 2.nonatomic和atomic 这两个关键字用语多线程管理,nontomic性能高,atomic性能低,不显示使用以atomic为默认值 3.readwrite和reado

【OC基础】03-OC内存管理

概述 跟Java和C#类似,OC创建的对象在堆上.与Java和C#不同的是Java和C#有垃圾回收机制,所以不需要程序员手动释放堆上的内存.而OC没有垃圾回收机制,必须手动管理内存的创建和释放.下面介绍一下OC内存管理内存管理的方式. 引用计数器 OC管理内存的方式类似C++中的智能指针,创建一个对象时,在ObjC中每个对象内部都有一个与之对应的整数(retainCount),叫“引用计数器”,当一个对象在创建之后初始化它的引用计数器为1,当调用这个对象的alloc.retain.new.cop

OC学习篇之---内存管理介绍和使用

在之前的一片文章我们说了OC中谓词操作:http://blog.csdn.net/jiangwei0910410003/article/details/41923507,从今天开始我们就来看一下OC中最难的一部分内容:内存管理 为什么说他难呢?因为内存如果需要我们程序员去管理的话,那个难度肯定是很大的,如果是Java,垃圾回收器会把这份工作给做了,我们不需要关心,但是就是因为如此,Android运行速度上会慢一下,原因很简单,Java的垃圾回收器有很多收集算法的,这个在回收的过程中是很浪费时间的