Objective-C语法学习 第一天

关于引用计数的内存管理

1.内存管理必要性

ARC是Mac OS X 10.7和iOS 5引入的新特性,也是苹果公司推荐是用的内存管理方法。启用ARC后,编译器会在适当的地方自动加入retain,release,autorelease等语句,来简化objective-C编程在内存管理方面的工作量。

程序未能释放已经不再是用的内存叫做内存泄露(memory leak)。

如果访问了已经被释放的内存,则会造成数据错误,严重时导致程序异常终止,在指针所指向的对象已被释放或回收的情况下,该指针就称为野指针(悬垂指针),继续是用这种指针会造成程序崩溃。

2.自用技术,自动引用计数和自动垃圾回收

Cocoa环境的objective-C提供了一种动态的内存管理方式,称为引用计数(reference counter)。这种方式会跟踪每个对象被引用的次数,当对象的引用次数为0时,系统就会释放这个对象所占用的内存,称为基于引用计数的内存管理。

手动引用计数(MRC) 自动引用计数(ARC)另外在MAC开发中还支持垃圾回收来管理内存。(垃圾回收第六章详解)

释放内存的并不是release,而是dealloc方法,同alloc不同,dealloc不是类方法而是一个势力方法。没收到一个release消息,对象的引用计数值就会减一。当对象的引用计数值是0的时候,系统就知道这个对象不再需要了。OC会自动向对象发送条dealloc消息来释放内存。通常不允许直接调用dealloc方法。。

3.自动释放

cocoa环境的OC提供一种对象自动释放(autorelease)的机制。这种机制的基本思想是把所有需要发送release消息的对象都记录下来。等到需要释放这些对象时,会给这些对象一直发送release消息。类NSautoreleasePoo(自动释放池 )就起到了记录的作用。

4.临时对象的生成

OC的很多类都提供一种生成临时对象的方法,这种类方法的命名规则是不以init开头,而以要生成的对象的类型作为开头,例如stringWithFormat:,这种方法称为遍历构造函数。这种临时对象生成后会被直接加入到内部的自动释放池,你不需要关心如何销毁它,区别于alloc,init创建的对象。

5.运行回路RunLoop

6.单例对象的简单创建(不考虑多线程安全,继承)

+(MyComponent)sharedMyComponent{

static MyConponent * shared;

if(shared == nil){

shared = [MyConponent alloc] init];

return shared;

}

}

7.什么是ARC

ARC(Automatic Reference Counting 自动引用计数)是一个编译器计数,利用此计数可以简化OC在内存管理方面的工作量。编译器会根据赋值操作,变量的初始化,变量的生命周期等因素,在核实的位置自动加入保持和释放(retain/release)相关的代码,至于在神峨眉位置加入什么样的代码,编译器会自己判断。

8.利用ARC时程序员需要遵守的规则和一些新增的概念和语法

禁止调用引用计数的相关函数 例如retain ,release,autorelease,retainCount

管理自动释放池的新语法

ARC中禁止使用NSAutoReleasePool,而是使用新语法@autoreleasepool来管理自动释放池。

手动管理内存情况下,自动释放池这样写

id pool = [NSAutoreleasePool alloc] init];

   / *  进行一系列操作 */

/ *  此处不可以使用break,return,goto之类的语句 * /

[pool release];  /* 释放对象*/

新的语法如下所示:

@autoreleasepool{

/ *在此进行一系列操作*/

/ * 可以使用break,return,goto等语句 */

}

@autoreleasepool在非ARC模式下也能使用,并且使用@autoreleasepool比使用第一种性能更好效率更高,所以无论是否是ARC,都推荐用第二种新语法。

9.变量的初始值

在ARC中,未指定初始值的变量(包括局部变量)都会被初始化为nil。

但是对于用_autoreleaseing 和_unsafe_unretained 修饰的变量来说,初始值是未定的。而对象以为的变量的初值和以前是一样的。

10.方法族

同对象申生成相关的方法集合叫做方法族(method family)

目前一共定义了5个方法族 alloc方法族,copy方法族,mutableCopy方法族,new方法族,init方法族。

11.方法dealloc的定义

手动管理内存情况下,当变量的引用计数为0的时候dealloc就会被调用并释放内存。所以,实例对象被释放前的所有“善后操作”都被定义在了dealloc中。

在ARC时,当对象被释放的时候,对象dealloc函数也会被调用,但又一些需要注意的地方:

首先:要被释放的对象的实例变量被另外一个对象保持的情况下,SRC会自动进行释放,因此不需要做任何处理(手动管理内存时,需要执行release操作让变量的引用计数减1)

其次:不能显示的调用dealloc。ARC的时候也不能调用父类的dealloc,尽管你可以创建一个定制的dealloc方法来释放资源而不是实例变量,单页不要调用【super dealloc】因为编译器会自动处理这些事情,如果你在代码调用了【super dealloc】会编译出错error:ARC forbids explicit messagesendof“dealloc”


你可能感兴趣的:(Objective-C语法学习 第一天)