一、计数器的基本操作
1> retain : +1,
 方法返回的是对象本身
2> release :-1
3> retainCount : 获得计数器
4> dealloc
  * 当一个对象要被回收的时候,就会调用
  * 一定要调用[super dealloc],这句调用要放在最后面

 
 2.概念
 1> 僵尸对象 :所占用内存已经被回收的对象,僵尸对象不能再使用(有时会崩溃)
 2> 野指针 :指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)
 3> 空指针 :没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错(
 OC不存在空指针错误,给空指针发送消息,不报错


1.你想使用(占用)某个对象,就应该让对象的计数器+1(让对象做一次retain操作)

 2.你不想再使用(占用)某个对象,就应该让对象的计数器-1(让对象做一次release)

3.谁retain,谁release
 
 4.谁alloc,谁release

 
尽量少使用类方法创建对象,因为此时是autorelease,于用户交互时自动释放


 二、set方法的内存管理
1> set方法的实现
- (void)setCar:(Car *)car
{
    if ( _car != car )
    {
        [_car release];
        _car = [car retain];
    }
}

2> dealloc方法的实现(不要直接调用dealloc)
- (void)dealloc
{

//绝对安全:
      self.name = nil;
     self.car = nil;
    [super dealloc];
}

三、@property参数
1> OC对象类型
@property (nonatomic, retain) 类名 *属性名;
@property (nonatomic, retain) Car *car;
@property (nonatomic, retain) id car;

// 被retain过的属性,必须在dealloc方法中release属性
- (void)dealloc
{
    self.car = nil;(注意:该语句等同于release原来的对象,然后对nil进行retain,对nil的任何操作没有作用)
    [super dealloc];
}

2> 非OC对象类型(int\float\enum\struct)
@property (nonatomic, assign) 类型名称 属性名;
@property (nonatomic, assign) int age;

四、autorelease
1.系统自带的方法中,如果不包含alloc、new、copy,那么这些方法返回的对象都是已经autorelease过的
[NSString stringWithFormat:....];
[NSDate date];

2.开发中经常写一些类方法快速创建一个autorelease的对象
* 创建对象的时候不要直接使用类名,用self


init的重写,即自定义构造赋值时应用self.car(注意,为点语法,set或get方法)才能保正绝对安全。

内存管理代码规范:
 1.只要调用了alloc,必须有release(autorelease)
   对象不是通过alloc产生的,就不需要release
 
 2.set方法的代码规范
 1> 
基本数据类型:直接复制
 - (void)setAge:(int)age
 { 
    _age = age;
 }
 
 2> OC对象类型
 - (void)setCar:(Car *)car
 {
    // 1.先判断是不是新传进来对象
    if ( car != _car )
    {
        // 2.对旧对象做一次release
        [_car release];
 
        // 3.对新对象做一次retain
        _car = [car retain];
    }
 }
 
 3.dealloc方法的代码规范
 1> 一定要[super dealloc],而且放到最后面
 2> 对self(当前)所拥有的其他对象做一次release
 - (void)dealloc
 {
    self.car = nil;
    [super dealloc];
 }

conllection内存的管理:

collection就是NSArray,NSDictionary,NSSet...等容器类,会自主管理自己内部的元素。

加⼊入collection中的对象会被retain 
移除出collection的对象会被release 
collection被释放会对内部所有对象release 

copy浅拷贝(copy),retain+1,多1指针指向该内存,数组、字典元素为浅拷贝
copy深拷贝(mutablecopy),retain不变,开辟一块新内存,retain由0到1.数组与字典其中的元素仍为浅拷贝
 
NSString *str = [[NSString alloc]init];
//可变、不可变字符串或数组、字典mutablecopy均为可变字符串
或数组、字典
        NSMutableString *str1 = [str mutableCopy];
        NSLog(@"%p,%p",str,str1);
        
        NSMutableString *str2 = [[NSString alloc]init];
        
        //可变、不可变字符串
或数组、字典copy均为不可变字符串或数组、字典
        NSString *str3 = [str copy];
        NSLog(@"%p,%p"
,str2,str3);
 

内存(MRC)的更多相关文章

  1. 巧谈 GCD

    转载自:http://www.jianshu.com/p/665261814e24 谈到iOS多线程,一般都会谈到四种方式:pthread.NSThread.GCD和NSOperation.其中,苹果 ...

  2. gcd - b- 201611302317

    谈到iOS多线程,一般都会谈到四种方式:pthread.NSThread.GCD和NSOperation.其中,苹果推荐也是我们最经常使用的无疑是GCD.对于身为开发者的我们来说,并发一直都很棘手,如 ...

  3. 【Bugly干货分享】iOS内存管理:从MRC到ARC实践

    Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的 ...

  4. iOS-旧项目中手动内存管理(MRC)转ARC

    在ARC之前,iOS内存管理无论对资深级还是菜鸟级开发者来说都是一件很头疼的事.我参 加过几个使用手动内存管理的项目,印象最深刻的是一个地图类应用,由于应用本身就非常耗内存,当时为了解决内存泄露问题, ...

  5. iOS阶段学习第20天笔记(MRC内存管理)

    iOS学习(OC语言)知识点整理 一.OC中的内存管理 1)概念:内存管理的对象为所有继承了NSObject的对象,对基本数据(如:int .float.double...)无效      OC中采用 ...

  6. iOS: ARC & MRC下string内存管理策略探究

    ARC & MRC下string内存管理策略探究 前两天跟同事争论一个关于NSString执行copy操作以后是否会发生变化,两个人整了半天,最后写代码验证了一下,发现原来NSString操作 ...

  7. iOS MRC ARC 内存管理

    转自:http://www.jianshu.com/p/48665652e4e4 1. 什么是内存管理 程序在运行的过程中通常通过以下行为,来增加程序的的内存占用 创建一个OC对象 定义一个变量 调用 ...

  8. Objective-c的内存管理MRC与ARC

    Objective-c的内存管理MRC与ARC   Objective-c中提供了两种内存管理机制MRC(MannulReference Counting)和ARC(Automatic Referen ...

  9. OC内存管理(MRC)

    首先说明一下几块存储区域: 栈区(局部变量.函数参数值) 堆区(对象.手动申请/释放内存) BSS区(未初始化的全局变量.未初始化的静态数据) 常量区(字符串常量以及初始化后的全局变量.初始化后的静态 ...

  10. iOS内存管理 ARC与MRC

    想驾驭一门语言,首先要掌握它的内存管理特性.iOS开发经历了MRC到ARC的过程,下面就记录一下本人对iOS内存管理方面的一些理解. 说到iOS开发,肯定离不开objective-c语言(以下简称OC ...

随机推荐

  1. 随机抽样一致性算法(RANSAC)

    本文翻译自维基百科,英文原文地址是:http://en.wikipedia.org/wiki/ransac,如果您英语不错,建议您直接查看原文. RANSAC是"RANdom SAmple ...

  2. 设计模式之适配器模式(Decorator)

    1.意图 动态地给一个对象添加一些额外的功能. 2.适用性 动态.透明的方式给单个对象添加职责. 如果不适合适用子类来进行扩展的时候,可以考虑适用装饰模式. 避免子类数目爆炸性增长. 3.结构 4.参 ...

  3. discuz二次开发笔记(二)------跳转函数运用

    前几天在增加修改功能时,突然用到一个提示函数,有点不理解,看了他的由来后果断做下笔记,感觉这在以后的开发中肯定还是要用的上的.有些地方不是很理解,在以后慢慢纠正.查补. Htm页面中用的js跳转: $ ...

  4. nginx1.9.4 +php 5.5.29+yii2.0配置手册

    nginx1.9.4 +php 5.5.29+yii2.0配置手册 目录 一.    php5.5.29安装配置    2 二.    nginx1.9.4安装配置    2 三.    yii2.0 ...

  5. Git客户端使用

    1.下载安装包 git:  https://git-for-windows.github.io/index.html tortoisegit: https://download.tortoisegit ...

  6. Best Financing(HD4833)

    每笔收入产生的收益是独立的. 计算所有点的收益率,累计. #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<al ...

  7. Struts2命名空间问题

    警告: No configuration found for the specified action: '/myNameSpace/login.action' in names 今天花了点时间把st ...

  8. Select标签 依据value值默认选中 Jquery

    网上找了非常多都是错的,不行的. 以下方法能够的 <script type="text/javascript"> $(document).ready(function( ...

  9. 【Android布局】在程序中设置android:gravity 和 android:layout_Gravity属性

    在进行UI布局的时候,可能常常会用到 android:gravity  和 android:layout_Gravity 这两个属性. 关于这两个属性的差别,网上已经有许多人进行了说明,这边再简单说一 ...

  10. CLR via C# 阅读笔记

    1.char在C#中为16位Unicode字符:int 映射到System.Int32;long映射到System.Int64. 2.重载时C#不考虑返回值,而CLR允许返回值不同,方法名和参数相同的 ...