Objective-C 内存管理

简介: Objective-C中,内存对象分二类: 1) 值类型,如 int、float、struct等基本数据类型; 2) 引用类型,通常是指继承自NSObject类的OC对象;   值类型在栈中,由系统自动管理,而引用类型在堆上,需要我们自己手工进行管理 OC中提供了二种内存管理机制: 1)...

Objective-C中,内存对象分二类:

1) 值类型,如 int、float、struct等基本数据类型;

2) 引用类型,通常是指继承自NSObject类的OC对象;

 

值类型在栈中,由系统自动管理,而引用类型在堆上,需要我们自己手工进行管理

OC中提供了二种内存管理机制:

1) 手动引用计数 MRC (Mannul Reference Counting);

2) 自动引用计数 ARC (Automatic Reference Counting);

主要区别体现在,我们写代码的时候需要自己手动添加retain/release这样的代码

手动引用计数

有二对关键词:

1) alloc 与  release

2) retain 与 release

原则上:谁alloc谁就负责release,谁retain谁负责release

alloc 用来创建对象,创建完成后,引用计数 +1,只调用一次

retain 使引用计数 +1,可多次调用

release 使引用计数 -1,可多次调用

通常属性retainCount,可知道一个对象当前被引用的数量,当引用计数为0时,说明此对象没有被引用,它会被系统从内存中销毁,销毁之前会调用对象的dealloc

 

自动引用计数

在该模式下,不允许使用retain、release、retainCount等方法,并且如果对象实现了dealloc方法时,不允许调用[super dealloc]方法。

该模式下转而替代属性(property)的修饰词为strong、weak,相当于手动引用计数下的retain、assign

 

属性修饰符由三部分组成, @property(原子性, 存取控制性, 内存管理)

原子性:atomic(默认值)、nonatomic

存取控制性:readwrite(默认)、readonly

内存管理:assign(默认)、retain,ARC中建议使用strong、weak进行替代

copy 与strong类似,但区别在于它是对生成的副本拥有所有权而不是传入的对象

 

autorelease这里没讲,深拷贝和浅拷贝这里也没讲,属性更没有具体深入提,这些点如果想真正搞清楚,都可以单独写一篇文章详解

目录
相关文章
|
iOS开发 存储 程序员
|
iOS开发
Objective-C编程 - 1. 浅谈内存分配
Objective-C语言的对象类型都必须用指针,对象所占的内存是在堆(heap)上分配的。 NSString也必须在堆上分配,因此必须用指针。 NSString *someString = @"here is the string";NSString *anotherString = someString; 上面例子的内存分布图如下:   分配在堆中的内存必须直接管理,分配在栈上用于保存变量的内存会在其栈帧弹出时自动清理。
900 0
|
Java iOS开发
objective-C 的内存管理之-引用计数
obj-c本质就是"改进过的c语言",大家都知道c语言是没有垃圾回收(GC)机制的(注:虽然obj-c2.0后来增加了GC功能,但是在iphone上不能用,因此对于iOS平台的程序员来讲,这个几乎没啥用),所以在obj-c中写程序时,对于资源的释放得由开发人员手动处理,相对要费心一些。
826 0
|
iOS开发 容器 开发者
objective-C 的内存管理之-自动释放池(autorelease pool)
如果一个对象的生命周期显而易见,很容易就知道什么时候该new一个对象,什么时候不再需要使用,这种情况下,直接用手动的retain和release来判定其生死足矣。但是有些时候,想知道某个对象在什么时候不再使用并不那么容易。
893 0
|
3月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
91 2