Objective-C基础教程学习笔记(九)内存管理

每个对象都维护一个保留计数器。对象被创建时,其保留计数器值1;对象被保留时,保留计数器值加1;对象被释放时,保留计数器值减1;当保留计数器值归0时,对象被销毁。在销毁对象时,首先调用对象的dealloc方法,然后回收其占用的内存以供其它对象使用。

当对象接收一条autorealse消息时,其保留计数器并不立即改变。相反,该对象只被放入NSAutoreleasePool中。当自动释放池被销毁时,会向池中的所有对象发送release消息,所有被自动释放的对象都将其保留计数器值减1。如果保留计数器值归0,则对象被销毁。当使用AppKit时,Objective-C会在适当的时间为你创建和销毁自动释放池,例如在当前用户事件处理完毕时。除此之外,你要负责创建自己的自动释放池,Foundation库工具的模板包含了这些代码。

Cocoa中关于对象及其保留计数器的3条规则:

如果使用new、alloc或copy操作获得一个对象,则该对象的保留计数器值为1.

如果通过任何其它方法获得一个对象,则假设该对象的保留计数器值为1,而且已经被设置为自动释放。

如果保留了某个对象,则必须保持retain方法和release方法使用的次数相等。

 

Automatic Reference Counting (ARC) 是一个编译期的技术,利用此技术可以简化Objective-C编程在内存管理方面的工作量。

ARC技术是随着XCode4.2一起发布的,在缺省工程模板中,你可以指定你的工程是否支持ARC技术,如果你不指定工程支持ARC技术,在代码中你必须使用管理内存的代码来管理内存。

自动计数(ARC)是一个编译期间工作的能够帮你管理内存的技术,通过它,程序人员可以不需要在内存的retain,释放等方面花费精力。

ARC在编译期间为每个Objective-C指针变量添加合适的retain, release, autorelease等函数,保存每个变量的生存周期控制在合理的范围内,以期实现代码上的自动内存管理。

In order for the compiler to generate correct code, ARC imposes some restrictions on the methods you can use, and on how you use toll-free bridging (see “Toll-Free Bridged Types”); ARC also introduces new lifetime qualifiers for object references and declared properties.

你可以使用编译标记-fobjc-arc来让你的工程支持ARC。ARC在Xcode4.2中引入,在Mac OS X v10.6,v10.7 (64位应用),iOS 4,iOS 5中支持,Xcode4.1中不支持这个技术.

如果你现在的工程不支持ARC技术,你可以通过一个自动转换工具来转换你的工程(工具在Edit->Convert menu),这个工具会自动所有工程中手动管理内存的点转换成合适自动方式的(比如移除retain, release等)。这个工具会转换工程中所有的文件。当然你可以转换单个文件。

ARC使得你不需要再思考何时使用retain,release,autorelease这样的函数来管理内存,它提供了自动评估内存生存期的功能,并且在编译期间自动加入合适的管理内存的方法。编译器也会自动生成dealloc函数。一般情况下,通过ARC技术,你可以不顾传统方式的内存管理方式,但是深入了解传统的内存管理是十分有必要的。

ARC中的新规则

为了ARC能顺利工作,特增加如下规则,这些规则可能是为了更健壮的内存管理,也有可能为了更好的使用体验,也有可能是简化代码的编写,不论如何,请不要违反下面的规则,如果违反,将会得到一个编译期错误。

  • 下面的这些函数:dealloc,retainreleaseretainCountautorelease。禁止任何形式调用和实现(dealloc可能会被实现),包括使用@selector(retain)@selector(release)等的隐含调用。
    你可能会实现一个和内存管理没有关系的dealloc,譬如只是为了调用
    [systemClassInstance setDelegate:nil] ,但是请不要调用[super dealloc] ,因为编译器会自动处理这些事情。
  • 你不可以使用NSAllocateObject或者NSDeallocateObject.
    使用alloc申请一块内存后,其他的都可以交给运行期的自动管理了。
  • 不能在C语言中的结构中使用Objective-c中的类的指针。
    请使用类类管理数据。
  • 不能使用NSAutoreleasePool.
    作为替代,@autoreleasepool被引入,你可以使用这个效率更高的关键词。
  • 不能使用memory zones.
    NSZone不再需要—本来这个类已经被现代Objective-c废弃。

ARC在函数和便利变量命名上也有一些新的规定

  • 禁止以new开头的属性变量命名。

其他的新功能

使用ARC技术,可以使得在栈上分配的指针隐式的初始化为nil,比如

- (void)myMethod {

 

    NSString *name;

 

    NSLog(@"name: %@", name);

 

}

 

上面的代码会Log出来一个null,不会象不使用ARC

posted @ 2012-10-12 13:29  TQ.CH  阅读(255)  评论(0编辑  收藏  举报