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. Live writer

    使用起来还是蛮方便的,安装速度很快,配置也不麻烦.

  2. VS2010中qDebug输出乱码的问题

    1.开发环境:安装Qt5.3.2(离线安装包安装):VS版本为:2010 SP1Rel:源代码默认保存格式为GB2312. 2.输出乱码的代码 #include <QtCore/QCoreApp ...

  3. wex5 教程 之 图文讲解 bind-css和bind-sytle的异同

    wex5作为网页开发利器,在前台UI数据交互设计中大量使用了绑定技术,即官方视频教学中也提到了KO,实质是数据绑定与追踪.在前台组件的属性中,为我们提供了两个重要的样式绑定属性,bind-css和bi ...

  4. php之XML转数组函数的方法

    <?/** * xml2array() will convert the given XML text to an array in the XML structure. * Link: htt ...

  5. WordCount示例深度学习MapReduce过程(1)

    我们都安装完Hadoop之后,按照一些案例先要跑一个WourdCount程序,来测试Hadoop安装是否成功.在终端中用命令创建一个文件夹,简单的向两个文件中各写入一段话,然后运行Hadoop,Wou ...

  6. ReactJs入门教程

    现在最热门的前端框架有AngularJS.React.Bootstrap等.自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和组件化的开发深深的吸引了我,下面来跟我一起领 ...

  7. IDispatch error #3092

    在采用ADO访问ACCESS数据库的时候,出现IDispatch error #3092错误的原因之一是在SQL语句中使用了保留关键字.比如:如果表的名称为User 则会出现该错误.,若字段为valu ...

  8. ajax (返回类型:text)

    <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...

  9. 11-JS基础

    JS声明变量 变量必须以字母开头 变量也能以 $ 和 _ 符号开头(不推荐这么做) 变量名称对大小写敏感(y 和 Y 是不同的变量) **提示:JavaScript 语句和 JavaScript 变量 ...

  10. 动态创建的DOM元素进行事件绑定

    http://files.cnblogs.com/files/xsmhero/jquery.livequery.js <script type="text/javascript&quo ...