iOS开发之oc(十一)--内存管理MRC

掌握内容

>理解内存管理的原理

>掌握手动内存管理MRC

>掌握内存管理在实际工程中的使用

(一)

1.理解部分

1.1内存管理 (传统内存管理demo)

1.1.1内存管理做了一件什么事?

内存管理就是确保开辟的堆空间得到正确的释放

如果堆空间没有释放,称为内存泄露

使用已释放的堆空间,称为提前释放

重复释放同一个空间,称为重复释放

1.1.2传统内存管理的困境

(1)当我们要释放一个堆,首先要确定使用这个堆的指针,都访问完毕,避免提前释放。

(2)释放指针指向的堆空间,首先要确定那些指针指向同一个堆,这些指针,只能释放一次,避免重复释放。

(3)模块化操作,那个模块负责释放,将成为最大的难题

(4)多线程的操作,不却定那个线程最后使用完毕

1.1.3 困境的解决方法

【引用计数器】

引用计数简称计数器,某一个指针指向了一个对象,引用计数加1,减少一个指针指向对象,引用计数减1,当引用计数为0的时候,由系统自动释放该对象占用的空间(模拟多人网络游戏,斗地主、QQ堂)

新建立一个对象,系统会自动给该对象添加一个引用计数(retaincount)的属性

1.1.4 内存管理的黄金法则

1,凡是用alloc,retain,new(或者以new开头的方法),copy(或者copy开头的方法),mutableCopy(或者muTableCopy开头的方法)创建的对象,都需要用release或者autorelease释放。

2,谁创建谁释放(哪个类创建,哪个类释放,谁写alloc,谁写release)

1.1.5 如何将工程改为MRC

1点击工程-》build settings->通过gar关键字的搜索搜出Automatic Re..Cou..

->将此选项的设置改称NO

1.2.1 alloc与release

alloc创建对象的过程,同时会将对象引用计数0加1,变成1

retain使对象引用计数器加1

release 会使对象引用次数减1

1.2.2析构函数

- (void)dealloc方法的注意事项

dealloc,称为析构函数,调用顺序和构造函数相反,一般情况下会在该函数中做一些释放内存工作

是在引用计数减为0时才会被调用(可以用来验证对象是否被释放)

语法:

-(void)dealloc
{
    // 注意内部代码顺序

//1.所有成员对象调用一遍release

//[super dealloc] 要写到dealloc的自后一行,[super dealloc]是真正释放当前的对象

[super dealloc];

}

1.2.3 类的复合中使用

retain 和assign(编译器特性)

retain 展开

-(void)setDog:(Dog *)dog

{
    if (_dog!=dog) {
        [_dog release];
        _dog=[dog retain];
    }
}

assign展开

-(void)setDog:(Dog *)dog

{
    _dog=dog;
}

1.2.3 autorelease与autoreleasepool

autoreleasepool 自动释放池,管理池子中的对象

autorelease,给对象发送autorelease消息时,会将对象存入autoreleasepool,当系统执行完自动释放池时,自动释放池会自动清空池子里边的对象

【注】自动释放池类似于一个数组,进行延迟释放,不会马上计数器减一,而是将当前对象放入最近的自动释放池中,当释放池释放的时候将池中每一个元素都释放一次

+方法的内存管理

 +(Student*)create

{
    Student *student=[[[Student alloc]init]autorelease];
//    [student autorelease];
    return student;
}

【注意事项】

1,对象的成员变量在构造方法中创建,应该在析构函数中释放

2,注意指针的转移,释放旧对象,保留新对象

3,从数据结构中如数组中读取出对象地址,如果需要长时间使用应当retain

1.2.4 字符串内存管理

1.2.4.1 字符串的内存管理

1>@“”创建出来的字符串在只读数据段,是只读的,引用计数为-1,默认的是autorelease对象不能给它发 送retainCount++ 或 retainCount - - 的消息

2>alloc retain copy mutablecopy new创建出的字符串均需要release

3>类方法创建出的字符串和直接赋值的字符串,不需要手动管理内存

1.2.4.2 copy和mutableCopy(只用来复制字符串)

1>copy发消息,可变和不可变字符串均转换成不可变字符串

NSMutableString *mulStr=[[NSMutableString alloc]initWithString:@"abc"];

        NSString *str=@"a";

        NSMutableString *mulStr2=[mulStr copy];

        [mulStr2 appendString:@"aa"];

2>mutableCopy,无论是可变还是不可变字符串,都将转换可变字符串

NSMutableString *mulString=[[NSMutableString alloc]initWithString:@"abc"];

        NSString *str=@"ab";

        NSMutableString* mulStr=  [str mutableCopy];

         [mulString appendString:@"ab"];

1.2.5 数组的内存管理

1>在可变数组中,通过添加和删除对象,均可以对该对象的引用计数加1和减1

2>在不可变数组中初始化时,初始化的对象的引用计数会加1,当该数组销毁的时候(release),数组会给初始化的对象的引用计数减1

时间: 2024-11-10 20:26:46

iOS开发之oc(十一)--内存管理MRC的相关文章

iOS开发之OC面试题总结

1.简述OC中内存管理机制 OC的内存管理机制是自动引用技术,内存管理的原则是谁开辟谁释放,分为ARC和MRC,MRC的话就是需要我们程序员手动管理内存,ARC不需要我们手动管理内存,系统会自行管理. 2.readwrite,readonly,assign,retain,copy,nonatomic .atomic.strong.weak属性的作用? readWrite读写特性, 可读可写. readonly只读, 只有getter, 没有setter. assign一般用于基本数据类型和ID类

iOS开发之oc(十二)--内存管理ARC

(一)自动内存管理 --ARC 1>简单点说就是让编译器完成堆空间的引用计数的加减,自动释放,程序员不再写retain 和release等方法 2>OC的自动内存管理不同于java 的垃圾回收,而是在预处理是直接在应该保留的地方加上retain,在应该改释放的地方加上release,是直接添加代码 3>从效率上讲,ARC优于手动内存管理 2.1.1 ARC 的局限性 1>使用ARC可能因为代码的不规范,导致内存提前释放 2>导入第三方库,或者导入旧代码,这些代码不支持ARC

ios开发之OC基础-类和对象

本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再将零散的知识点整理出来.这样的学习方法会带来更多的收获,同时要多做练习,按照思路,默写.改写代码.在这里,感谢欧阳坚老师,学习你的课程使我走上了ios的开发之路. 一定要明确一个要从事的方向,要不然就会感到迷茫.学习ios开发,并且从事ios开发这个行业,这就是我的选择.看到我的博客系列文章,其中大

iOS开发之oc(二十一)--Foundation(6)NSNumbe

NSNumber 作用:可以将基本数据类型转化为对象,致使其能在数组.字典中使用 代码示例 1. void use() { // NSNumber基本使用 // 1. 把基本数据类型转化成对象 NSNumber *num = [NSNumber numberWithInt:10]; NSDictionary *dic = @{ @"name": @"Rose", @"age": num}; NSNumber *num1 = dic[@"

iOS开发之oc(回顾笔记)--类与对象(1)

理论是枯燥的,所以有点长.哈哈哈~ 要学习一门语言,我们首先得了解它,那么 [什么是OC] objectiv-c  简称 OC,是一门基于C语言为基础编写而成的面向对象的语言.完全兼容C语言:可以在OC代码中混入C语言代码,甚至是C++代码: 可以使用OC开发Mac OS X平台和iOS平台的应用程序. (一)首先,先了解一下面向过程和面向对象: [面向过程] 1.面向过程的语言所有语句都是祈使句  2.面向过程的语言是数学逻辑的映射 3.面向过程语言的程序 = 数据 + 算法 C语言就是一门面

iOS开发之oc(十七)--Foundation(2)NSString及简单的字符串读取和写入

NSString : 不可变字符串 NSMutableString : 可变字符串 // 重点注意:URL不能读取文件名为中文的文件,否则为null,读不出来,要换为英文 // URL读取文件才是万能 下面是一些功能的代码 1.创建和读取 void stringCreate() { /* 1.字符串的创建的方法 */ NSString *s1 = @"jack"; //NSString *s2 = [[NSString alloc] initWithString:@"jack

李洪强iOS开发之OC语言基础知识

OC语言基础知识 一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能的类. 术语:OO面向对象.OOP面向对象编程   二.类 (一)关于类 类的设计只关注三个东西:类名.属性和方法 注意:一般名词都是类,拥有相同属性和行为的对象都可以抽象为一个类,类名是标识符的一种,需要符合规范,通常类名的第一个字母大写,且不能有下划线,如果有多个单词则使用驼峰标识.在对方法进行

李洪强iOS开发之OC语言前期准备

OC语言前期准备 一.OC简介 Oc语言在c语言的基础上,增加了一层最小的面向对象语法,完全兼容C语言,在OC代码中,可以混用c,甚至是c++代码. 可以使用OC开发mac osx平台和ios平台的应用程序. 拓展名:c语言-.c  OC语言.-m  兼容C++.-mm 注:其实c语言和oc甚至任何一门语言都只是我们为了实现一些功能,达到一些效果而采用的工具,抛开语法的差别外,我想最重要的应该是在解决问题的时候考虑的角度和方法不一样而已,然而这也构成了学习一门语言的重要性. 二.语法预览 (一)

李洪强iOS开发之OC语言description方法和sel

OC语言description方法和sel 一.description方法 Description方法包括类方法和对象方法.(NSObject类所包含) (一)基本知识 -description(对象方法) 使用NSLog和@%输出某个对象时,会调用对象的description方法,并拿到返回值进行输出. +description(类方法) 使用NSLog和@%输出某个对象时,会调用类对象的description方法,并拿到返回值进行输出,把整个对象一次性打印出来,打印对象使用%@. 使用@%打