IOS开发学习笔记013-内存管理

内存管理

  1、基本知识

  2、关闭ARC机制

  3、@property

  4、循环引用

  5、自动释放池

一、基本知识

内存的分类

  栈:局部变量

  堆:动态申请的对象,变量等

  全局(静态):static 变量,const变量,全局变量等

引用计数器

   每个OC对象都有自己的引用计数器,是一个整数,表示“对象被引用的次数”,即有多少人正在使用这个OC对象

  每个OC对象内部专门有4个字节的存储空间来存储引用计数器

 作用

  当使用alloc、new或者copy创建一个新对象时,新对象的引用计数器默认就是1

  当一个对象的引用计数器值为0时,对象占用的内存就会被系统回收。换句话说,如果对象的计数器不为0,那么在整个程序运行过程,

它占用的内存就不可能被回收,除非整个程序已经退出。

引用计数器的操作

  1、给对象发送一条retain消息,可以使引用计数器值+1(retain方法返回对象本身)

  2、给对象发送一条release消息,可以使引用计数器值-1

  3、可以给对象发送retainCount消息获得当前的引用计数器值

总结:有始有终,有加有减。

二、关闭ARC机制

如果要自己调用release等函数,需要关闭ARC功能,关闭方法参考

http://jingyan.baidu.com/article/358570f67babbcce4724fcd8.html

管理方式set方法加1,dealloc 减1

1、想使用某个对象,就应该让对象的计数器加1(retain)

2、不想再使用某个对象时,就应该让对象的计数器减1 (release)

2、谁retain谁release,谁alloc谁release

内存管理规范:

1、只要调用alloc必须有release,如果不是alloc那就不需要release

2、set 方法

  基本数据类型直接赋值

  OC对象类型。

  先判断是不是同一个对象 if(car != _car)。

  然后对旧对象release,对新车进行一次retain操作。

3、dealloc

  一定要调用[super dealloc],而且放到最后边

  一定要当前对象release一次

 三、@property 

@property  // 默认是赋值,retain 参数实现内存管理

@property int age; // 默认是赋值
@property(retain) Book * book; // retain 参数实现内存管理

内存管理总结:

1、内存管理的相关参数

  retain  :release旧值,retain新值

  assign  :直接赋值,默认就是这个,适用于非OC对象类型

  copy   :release旧值,copy新值

2、是否要生成set方法

  @property (readonly) int age; // 只读,只生成getter方法

  @property (readwrite) int name; // 读写,默认是读写

3、多线程管理

  nonautomic   : 性能高,

  automic     : 性能低(默认)

  @property  (nonautomic , assign) int age; // 以后这样写

4、setter和getter方法的名称

  @property  (setter = myAge:) int age; // setter = set方法名 ,自定义setter方法名,不要忘记冒号

  @property  (getter = getAge) int age; // getter = get方法名 ,自定义getter方法名

  @property  (getter = isRich) BOOL rich; // 一般这个会用在BOOL类型的变量声明,getter方法名以is开头

四、循环引用

类A引用类B,类B引用类A。

解决方法:  @class A;//  仅仅告诉编译器A是一个类

在类引用前,在声明文件里使用关键字@class A;

@class 和#import区别

  1、#import方式会包含被引用类的所有信息,包括被引用类的变量和方法;@class方式只是告诉编译器在A.h文件中 B *b 只是类的声明,具体这个类里有什么信息,这里不需要知道,等实现文件中真正要用到时,才会真正去查看B类中信息

  2、如果有上百个头文件都#import了同一个文件,或者这些文件依次被#improt,那么一旦最开始的头文件稍有改动,后面引用到这个文件的所有类都需要重新编译一遍,这样的效率也是可想而知的,而相对来 讲,使用@class方式就不会出现这种问题了

  3、在.m实现文件中,如果需要引用到被引用类的实体变量或者方法时,还需要使用#import方式引入被引用类

在开发中引用一个类的规范

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

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

 3、 循环retain的解决方案

   一端用retain,一端用assign

五、自动释放池

autorelease 基本用法

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

  2、当对象释放池被销毁时,会自动释放里面的所有对象(release操作)

  3、会返回对象自身

  4、调用autorelease后,对象的计数器不变

好处

  1、不用再关心对象释放的时间

  2、不用再关心什么时候调用release

注意事项

  1、占用内存较大的对象不要随便使用autorelease

  2、占用内存较小的使用autorelease,没有太大影响

  3、autorelease和release一样,也是和alloc/new/copy一一对应

 1 @autoreleasepool // 自动释放池
 2     {
 3         Person *p = [[[Person alloc] init] autorelease]; // autorelaese 方法返回对象本身,计数器并不会立即改变
 4         Card *c = [[[Card alloc] init] autorelease];
 5
 6         p.card = c;
 7         c.person = p;
 8
 9         @autoreleasepool // 可以嵌套
10         {
11
12             Person *p = [[[Person alloc] init] autorelease];
13             Card *c = [[[Card alloc] init] autorelease];
14
15
16             p.card = c;
17             c.person = p;
18
19
20         }
21
22     }
时间: 2024-12-05 10:39:34

IOS开发学习笔记013-内存管理的相关文章

IOS开发学习笔记-(2)键盘控制,键盘类型设置,alert 对话框

一.关闭键盘,放弃第一响应者,处理思路有两种 ① 使用文本框的 Did End on Exit 绑定事件 ② UIControl on Touch 事件 都去操作 sender 的  resignFirstResponder #import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (weak, nonatomic) IBOutlet UITextField *txtUserName; @pro

linux kernel学习笔记-5内存管理(转)

http://blog.sina.com.cn/s/blog_65373f1401019dtz.htmllinux kernel学习笔记-5 内存管理1. 相关的数据结构 相比用户空间而言,在内核中分配内存往往受到更多的限制,比如内核中很多情况下不能睡眠,此外处理内存分配失败也不像用户空间那么容易.内核使用了页和区两种数据结构来管理内存: 1.1 页 内核把物理页作为内存管理的基本单位.尽管CPU的最小可寻址单位通常为字(甚至字节),但是MMU(内存管理单元,管理内存并把虚拟地址转换为物理地址的

iOS开发学习笔记:基础篇

iOS开发需要一台Mac电脑.Xcode以及iOS SDK.因为苹果设备都具有自己封闭的环境,所以iOS程序的开发必须在Mac设备上完成(当然,黑苹果应该也是可以的,但就需要花很多的精力去折腾基础环境),Xcode是一个集成开发环境,包括了编辑器.调试.模拟器等等一系列方便开发和部署的工具,iOS SDK则是开发应用所必需,不同的SDK分别对应不同的iOS版本或设备,通常我们需要下载多个iOS SDK以确保我们开发的程序能够在不同版本的iOS上正常运行. 创建新工程 Xcode提供了很多种工程模

IOS开发学习笔记-(3) 进度条、等待动画开始停止

一.创建对应空间视图  ,如下图: 二.编写对应的 .h 代码,如下 : #import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (weak, nonatomic) IBOutlet UIActivityIndicatorView *activWaitNetWork; @property (weak, nonatomic) IBOutlet UIProgressView *pgrsDownLo

IOS开发学习笔记(二)-语音识别(科大讯飞)

上次简单地讲解了如何利用科大讯飞完成语音合成,今天接着也把语音识别整理一下.当然,写代码前我们需要做的一些工作(如申请appid.导库),在上一篇语音合成的文章当中已经说过了,不了解的可以看看我上次的博文,那么这次直接从堆代码开始吧. 详细步骤: 1.导完类库之后,在工程里添加好用的头文件.在视图里只用了一个UITextField显示识别的内容,两个UIButton(一个开始监听语音,一个结束监听),然后引入类.添加代理,和语音合成的一样. MainViewController.h 1 #imp

Linux System Programming 学习笔记(九) 内存管理

1. 进程地址空间 Linux中,进程并不是直接操作物理内存地址,而是每个进程关联一个虚拟地址空间 内存页是memory management unit (MMU) 可以管理的最小地址单元 机器的体系结构决定了内存页大小,32位系统通常是 4KB, 64位系统通常是 8KB 内存页分为 valid or invalid: A valid page is associated with an actual page of data,例如RAM或者磁盘上的文件 An invalid page is

IOS开发学习笔记(1)-----UILabel 详解

1. [代码][C/C++]代码     //创建uilabelUILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(20, 40, 280, 80)];//设置背景色label1.backgroundColor = [UIColor grayColor];//设置taglabel1.tag = 91;//设置标签文本label1.text = @"Hello world!";//设置标签文本字体和字体大小label1.

IOS开发学习笔记(2)-----UIButton 详解

1. [代码][C/C++]代码     //这里创建一个圆角矩形的按钮    UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];    //    能够定义的button类型有以下6种,//    typedef enum {//        UIButtonTypeCustom = 0,          自定义风格//        UIButtonTypeRoundedRect,        

IOS开发学习笔记--语音合成(科大讯飞)

      现在语音服务越来越热,我们平时使用的很多软件都带有语音合成和识别功能,用起来也很方便.说到语音服务,Google和微软都提供过API接口,不过笔者要介绍的是国内的智能语音技术提供商---科大讯飞.之前看过一个比较Google.微软和科大讯飞语音识别引擎的博文(http://fqctyj.blog.163.com/blog/static/70843455201361955322797/),有兴趣可以去看看.笔者接触语音服务的时间也不长,对语音服务也不是很了解,但是拆解过科大讯飞的Dem