Java培训、Android培训、iOS培训、.Net培训、期待与您交流!

(以下内容是对黑马苹果入学视频的个人知识点总结)

(一)计数器

每个对象内部都保存了一个与之相关联的整数,称为引用计数器,当使用alloc、new或者copy创建一个对象时,对象的引用计数器被设置为1

1>给对象发送一条retain消息,可以使引用计数器值+1
2>给对象发送一条release消息,可以使引用计数器值-1
3>当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收,系统也会自动向对象发送一条dealloc消息。一般会重写dealloc方法,在这里释放相关资源。一定不要直接调用dealloc方法
4>可以给对象发送retainCount消息获得当前的引用计数器值
 当一个对象要被回收的时候,就会调用
一定的[super dealloc]
 #import "Person.h"

 @implementation Person

 // 当一个Person对象被回收的时候,就会自动调用这个方法
- (void)dealloc
{
NSLog(@"Person对象被回收"); // super的dealloc一定要调用,而且放在最后面
[super dealloc];
} @end

2)内存的管理原则

1.谁创建,谁释放(“谁污染,谁治理”)。如果你通过alloc、new或(mutable)copy来创建一个对象,那么你必须调用release或autorelease。换句话说,不是你创建的,就不用你去释放

2.一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease

3.谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release

注意:

1> 僵尸对象 :所占用内存已经被回收的对象,僵尸对象不能再使用

2> 野指针 :指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)

3> 空指针 :没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错

3)多个对象之间的内存管理

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

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

3>谁retain,谁release

4>谁alloc,谁release

int main()
{ Book *b = [[Book alloc] init]; Person *p1 = [[Person alloc] init]; [p1 setBook:b]; [p1 release];
p1 = nil; [b release];
b = nil;
return ;
}

(二)set方法的内存管理

内存管理代码规范:

1>只要调用了alloc,必须有release(autorelease)

对象不是通过alloc产生的,就不需要release

2>set方法的代码规范

① 基本数据类型:直接复制

  - (void)setAge:(int)age
{
_age = age;
}

② 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
{
[_car release];
[super dealloc];
}

(三) @property参数

格式:@property(参数1,参数2)类型 名字; 
参数可有可无

参数主要分为3类

①读写属性:readwrite/readonly

*readwrite :同时生成set方法和get方法(默认)

*readonly  :只会生成get方法

②setter处理:assign/retain/copy

*retain : release旧值,retain新值(用于OC对象)
 @property (retain) Book *book;

*assign : 直接赋值,不做任何内存管理(默认,用于非OC对象类型)

*copy   : release旧值,copy新值(一般用于NSString *)
③原子性:atomic/nonatomic
前者性能低和后者性能高,控制多线程管理
 @property (getter = isRich) BOOL rich;

 @property (nonatomic, assign, readwrite) int weight;

 @property (readwrite, assign) int height;

 @property (nonatomic, assign) int age;

 @property (retain) NSString *name;
 
(四)循环引用
 1) @class的作用:仅仅告诉编译器,某个名称是一个类
      @class Person; // 仅仅告诉编译器,Person是一个类

2)开发中引用一个类的规范

1> 在.h文件中用@class来声明类

2> 在.m文件中用#import来包含类的所有东西

3)两端循环引用解决方案

1> 一端用retain

2> 一端用assign

 #import <Foundation/Foundation.h>
#import "Card.h" @interface Person : NSObject @property (nonatomic, retain) Card *card; @end

(五) autorelease

1>autorelease的基本用法

①  会将对象放到一个自动释放池中

②  当自动释放池被销毁时,会对池子里面的所有对象做一次release操作

③  会返回对象本身

④  调用完autorelease方法后,对象的计数器不变 

2>autorelease的好处
           ①  不用再关心对象释放的时间
           ②  不用再关心什么时候调用release
 
3>autorelease的使用注意
           ①  占用内存较大的对象不要随便使用autorelease
           ②  占用内存较小的对象使用autorelease,没有太大影响
4>错误写法
           ①  alloc之后调用了autorelease,又调用release

 
 

黑马程序员——OC语言 内存管理的更多相关文章

  1. 黑马程序员——OC的内存管理学习小结

    内存管理在Objective-C中的重要性就像指针在C语言中的重要程序一样. 虽然作为一门高级语言,但OC却没有内存回收机制.这就需要开发者来对动态内存进行管理.OC中内存管理的范围是:任何继承了NS ...

  2. 黑马程序员_ Objective-c 内存管理笔记

    引用计数器 当一个对象被创建出来,就要分配给内存这个对象,当不用这个对象的时候,就要及时的回收,为了可以明确知道对象有没有被使用,就要用引用计数器来体现,只要计数器不为0,表明对象被使用中. 1.方法 ...

  3. 黑马程序员——OC语言基础语法 面向对象的思想

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结)(一)基础语法 1)关键字 @interface.@implementati ...

  4. 黑马程序员——OC语言 核心语法(2)

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)id 1)简介:万能指针,能指向任何OC对象,相当于NSObject ...

  5. 黑马程序员——OC语言 类和对象

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)类 1)类的声明 代码编写 ①定义一个Car类,拥有2个属性:轮子数 ...

  6. 黑马程序员——OC语言 核心语法 (3)

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)分类Category 1) 基本用途 如何在不改变原来类模型的前提下 ...

  7. 黑马程序员——OC语言 三大特性之多态

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) 三大特性之一的多态 (一)多态的基本概念 OC对象具有多态性体现在 Per ...

  8. 黑马程序员——OC语言 三大特性之继承

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) 三大特性之继承 (一)继承的基本用法 先建立个Animal再用Dog继承前 ...

  9. 黑马程序员——OC语言Foundation框架 (2) NSArray NSSet NSDictionary\NSMutableDictionary

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)NSArray 1>NSArray :不可变数组 ①创建方法 ...

随机推荐

  1. 【过程改进】 windows下jenkins常见问题填坑

    没有什么高深的东西,1 2天的时间大多数人都能自己摸索出来,这里将自己遇到过的问题分享出来避免其他同学再一次挖坑. 目录 1. 主从节点 2. Nuget自动包还原 3. powershell部署 4 ...

  2. 淘宝druid数据库连接池

    昨天偶然间在@红薯的一篇技术分享中发现了它的身影,从此想到了去看看他到底是什么西,然后在@开源中国上看到了它的功能介绍,心痒难耐 开始了对它的配置测试. 但是第一次启动就发现了一个问题, Tomat报 ...

  3. 如何利用php array_multisort函数 对数据库排序

    数据库中有4个字段分别是id,volume,edition,name. 要求对查询结果按照volume+edition从大到小排序.下面将一下array_multisort函数array_multis ...

  4. python :页面布局 ,后台管理页面之左侧菜单跟着滚动条动

    左侧菜单跟着滚动条动 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http:// ...

  5. ubuntu环境极其内存情况

    001:安装系统后 002:synergy 003:vim-cscope (修改vim脚本) 004:root 005:bashrc修改 006:bcompare 007:lib 008:git,gi ...

  6. ubuntu下安装、启动和卸载SSH

    想往VMWare虚拟机上的Ubuntu里面拷贝代码,发现之前安装好的secureCRT链接不上.发现是ssh安装配置出了问题,于是就把openssh-server卸载后重装,发现又是与openssh- ...

  7. 学的一点点ps

    从C语言的代码中解脱开始学ps,看到色彩鲜明的东西,心里只有那么爽.哈哈.只学习3天,虽然只是一些皮毛,可还是学到了一些以前不知道的东西.让我对ps多了很多兴趣,决定以后要自学更多的ps技能.要给图片 ...

  8. 程序设计入门——C语言 第3周编程练习 2 数字特征值(5分)

    2 数字特征值(5分) 题目内容: 对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值.对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推.这个整数在第n位上的数字记作 ...

  9. TCP/IP协议学习(三) STM32中ETH驱动配置注意事项

    1.MII/RMII/SMI接口连接和配置 SMI又称站点管理接口,用于cpu与外置PHY芯片通讯,配置相关参数,包含MDC和MDIO两个管脚(CPU上有对应引脚,当然用普通GPIO口模拟SMI管理也 ...

  10. Android自动化测试中Monkeyrunner详解

    之前有写过monkey测试详细说明,几天就说说monkeyrunner. monkeyrunner工具提供了一个API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器 ...