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. 【实践】纯jquery实现图片滑动无缝轮播,带左右按钮及控制按钮

    在此随笔之前,博主已经做过一次图片滑动轮播,如过你也有看过就会知道里面的效果在自动轮播的时候有一个不太美观的效果,就是当最后一张图片滑动切换到第一张图片的时候会看到一个快速向左滑动的效果,这是很不美观 ...

  2. 关于学习Knockoutjs--入门(二)

    这两天终于闲一丢丢了,可以有多点时间学习一下拉.接下来要写到的还是Knockoutjs. Knockout是建立在以下3个核心功能之上的: 1. 属性监控与依赖跟踪 2. 声明式绑定 3. 模版机制 ...

  3. OBD K线抓包 II

    9141的激活过程是先发WakeUp, 然后用Link: const u8 LinkCmd9141[7]  = {6,0x68,0x6A,0xF1,0x01,0x00,0xC4}; 14230的Lin ...

  4. CentOS7安装Nginx-1.9.9+PHP5.6

    linux系统CentOS7 Nginx 下载地址http://nginx.org/en/download.html wget下载路径http://nginx.org/download/nginx-1 ...

  5. eclipse编辑struts.xml 代码提示

    先确定xml文件 window-preferences-查询catalog 点击add 关于这个Location 先找到你下载的struts压缩包 然后找到 解压这个jar包 你会得到一些dtd文件 ...

  6. jquery幻灯片

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  7. HDU Coprime

    Coprime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total S ...

  8. CSS 高级语法 ---- 继承和选择器的分组

    1. 选择器的分组 —————————————————————————   可以对选择器进行分组,被分组的选择器享用共同的声明.   h1,h2,h3,h4,h5,h6 { color: green; ...

  9. Bootstrap_响应式网格系统

    首先添加CSS样式: [class *= col-]{ background-color: #eee; border: 1px solid #ccc; } [class *= col-] [class ...

  10. sqlite创建表

    create table bike (id ) primary key, password ));