OC语言学习 (七) 内存管理

只有对象 才需要内存管理,基本数据型类型不需要。

对象的 release、retain、retainCount方法说明:

release 引用计数-1

retain 引用计数+1,返回对象本身。 返回的类型是instancetype

retainCount 返回引用计数的数目

当引用计数归0后,会调用对象的 dealloc方法,所以在dealloc中需要释放成员属性对象的引用。

在子类的dealloc方法中,需要释放父类的成员,所以[super dealloc];

retain和release的使用

1.当一个对象alloc、new、[mutable]copy后就分配了内存,所以在使用完毕后,就release。 类似 [person release]

2.当调用对象的retain方法,使用完对象后,需要release

3.在set方法中,类似 - (void)setCup:(Cup*)cup;  如果跟内部成员不同,需要先release旧值,再retain参数:

- (void)setCup:(Cup*)cup {

if (cup != _cup) {

[_cup release];

_cup = [cup retain];

}

}

最后在持有cup属性的对象销毁时,即在该对象的dealloc方法中调用 [_cup release];

关于autoreleasepool

就是一个自动对象引用释放池,在早前呢,用NSAutoreleasePool,来创建一个池对象,再调用[pool addObject:obj]添加到池中。

池子 会在对象不使用后,自动发送一条release消息。 多次添加同一对象入pool,最后也会发送多次的release。

autorelease方法

Cup* cup = [[[Cup alloc] init] autorelease];

内部其实就是调用了NSAutoreleasePool的addObject方法。 会自动release

------------------------------------------------------------------------------------------------------------------------

以上为手动内存管理

以下为自动内存管理

iOS5.0(LLVM3.0)引入了 ARC(automatic reference counting),即能自动管理对象引用。自动retain,自动release。

Obj-C: (ARC) 使用ARC的注意事项

1. ARC不能解决非Objective-C的内存管理, 比如malloc(), 需要free()

2. ARC最低支持Xcode 4.2 和 iOS4

3. 通过(Edit > Refactor > Convert to Objective-C ARC)把已有的代码转换成ARC

4. ARC不能再使用retain, release, retainCount, autorelease, NSAutoreleasePool(用

@autoreleasepool代码块替代)

5. ARC不能在dealloc()中调用[super dealloc], dealloc()仍可用在删除注册的代理或通知等.

6. ARC不能处理在C struct中包含一个对象指针的情况, 应用Objective-C Class来封装.

7. 属性起名不可以用new开头

8. ARC可以兼容Obj-C++

9.不能使用“new”开始的属性名称 (如果使用会有下面的编译错误”Property’s synthesized getter follows Cocoa naming convention for returning ‘owned’ objects”)

10. id与void *间的如果cast时需要用特定的方法(__bridge关键字)

11.不能使用NSAllocateObject, NSDeallocateObjec

12.不重载dealloc(如果是释放对象内存以外的处理,是可以重载该函数的,但是不能调用[super dealloc])

ARC加载非ARC文件时, 在Targets->Build Phases->Compile Sources中找到相应文件添加字段:

-fno-objc-arc

@autoreleasepool 代码块,一个代码块里的对象,在代码块结束时,会给内部的所有对象发送一次release消息。

代码块可以嵌套。

时间: 2024-10-30 20:58:25

OC语言学习 (七) 内存管理的相关文章

23-黑马程序员------OC 语言学习笔记---内存管理

黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 对于面向对象的变成语言,程序需要不断地创建对象.初始,创建的所有程序通常都有指针指向它,程序可能需要访问这些对象的实例变量或调用这些对象的方法,随着程序的不断执行,程序再次创建了一些新的对象,而那些老的对象已经不会再被调用,也不

iOS学习笔记---oc语言第七天

类的扩展 NSDate是Cocoa中用于处理日期和时间的基础类,封装了某一给定的时刻,具体的日期 时间和时区 使用+date方法获取当前日期和时间 1 NSDate *date = [NSDate date];//获取当前时间 2 NSLog(@"%@",date);//无论你是哪个时区的时间,打印的总是o时区的时间 3 NSDate *date2 = [NSDate dateWithTimeIntervalSinceNow:60*60*8];//从现在开始之后的时间 4 NSLog(

OC基础 05-手动内存管理(MRC)

---恢复内容开始--- MRC: Manul(手动) Reference(引用) Counting(计数) 什么是手动引用计数? 所有对象的内容都需要我们手动管理, 需要程序员自己编写release/retain等代码 内存管理的原则就是有加就有减 也就是说, 一次alloc/new/copy对应一次release, 一次retain对应一次relese 内存管理的重要性: 移动设备的内存极其有限,每个app的占用内存也是有限制的. 当我们创建一个OC对象,定义一个变量,调用一个函数或者方法,

黑马程序员——oc语言学习心得—— 属性声明和赋值

黑马程序员——oc语言学习心得—— 属性声明和赋值 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1,在oc中所有类继承与终极父类Object2,声明字符变量采用N是string  *_xxx 实例变量一般以下划线开头3,在oc中方法以+ -号区分 -号开头是实例方法或对象方法  +号开头是类方法  前置用对象调用 后者用类名调用4,在xcode4以后声明@property 不用在写@snysize  自动生成get.set方法5,属性

JVM学习笔记-内存管理

第一章 内存分配 1. 内存区域. 方法区和堆(线程共享),程序计数器 , VM栈 和 本地方法栈(线程隔离). 1) java虚拟机栈:线程私有.描述的是java方法执行的内存模型:栈帧,用户存储 局部变量表,操作数栈,动态链接,方法出口等信息. 局部变量表在编译时即可完全确定!如果线程请求的栈深度大于 规定的深度,StackOverflowError. 2) 本地方法栈,类似. 3)堆:垃圾收集器管理的主要区域.线程共享. 4)方法区: 各个线程共享.存储:加载的类信息,常量,静态变量,即时

黑马程序员—oc语言学习心得—block

黑马程序员—oc语言学习心得—block -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1,程序一般用typedef定义一个block类型 然后调用 typedef void(^xxx)(); 可使用助记符 inlineblock 2,Block内部可以访问外部变量:默认情况下,Block内部不能修改外部的局部变量 给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改. 3,block的作用: 利用block封

黑马程序员——oc语言学习心得----NSFileManager

黑马程序员——oc语言学习心得----NSFileManager -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 自己总结了下NSFileManager的简单几个用法 : // 首先要创建文件管理器 NSFileManager *fm=[NSFileManager defaultManager]; 1,判断文件是否存在 fileExistsAtPath: 2,判断文件是否是目录 fileExistsAtPath: 3, 判断文件是否可读

七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 [email&#160;protected]参数 [email&#160;protected]和循环retain的使用 6.NSString的内存管理

1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程序闪退. 2.OC内存管理的范围 : 管理任何继承NSObject的对象,对其他的基本数据类型无效. 3.对象类型是程序运行过程中动态分配的,存储在堆区:内存管理主要是对 堆区中的对象的内存管理. 4.OC内存管理的原理 为了防止内存泄露 对象的引用计数器 : 每个OC对象都有自己的引用计数器,是一

24-黑马程序员------OC 语言学习笔记--- autorelease和ARC

  黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- autoreleaseOC提供了autorelease语法,系统可以將很多对象放到一个自动释放池中,在某个时刻统一release一次.这样就不用再次调用release方法.1.autorelease的基本用法:   1>