帮助我了解Objective-C和Cocoa中的内存管理

时间:2009-10-15 18:27:52

标签: objective-c memory-management

不要开枪,我知道这一定要问过一千次......

我对Objective-C内存缺乏良好的文档感到不舒服。我理解alloc,dealloc,retain,release等等,但是脑子里还有一些混乱。

它只是懒惰的编程还是Objective-C在分配内存方面做了一些'幕后'自动化活动?

来自C背景(几个世纪以前),我知道指针只是指针......你还必须为指针指向的位置保留空间,否则你将开始踩踏自己的程序和其他变量。

我找到的代码示例(在我读过的书中 - 所有这些都与当前版本的XCode和Interface Builder完全不同)似乎永远不会为某些对象(如NSString)分配存储空间。它们声明一个指针(例如NSString * aString;)然后开始为字符串分配文本。每次调用都没有为字符串分配内存!?!?所有这些例子都只是懒惰的代码寻找崩溃的地方吗?

此外,书籍谈论声明“池”内存并且它会自动插入到代码中。当我创建项目,类和对象时,在任何地方都找不到这样的代码。 Apple是否已完成此自动插入,还是在编译期间发生了什么?

是否有倒数第二个参考书或网站可以一劳永逸地解释这一切?

5 个答案:

答案 0 :(得分:15)

答案 1 :(得分:2)

我认为用于理解Objective-C语言中的内存管理的最佳参考是 Objective-C 2.0编程语言,可以从Apple获得的PDF格式以下网址:

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/ObjC.pdf

第3章分配和初始化对象对内存管理有用。

在Objective-C语言中对内存管理的不太详细但更简洁的讨论可以在以下URL中找到的 Cocoa内存管理的非常简单的规则中找到:

http://www.stepwise.com/Articles/Technical/2001-03-11.01.html

有关NSString分配规则的具体问题在该文章的标题保留计数规则下有所介绍。

“使用便捷构造函数创建的对象(例如NSString的stringWithString)被认为是自动释放的。”

另一本理解Cocoa编程的好书有很多例子和解释,可以从Amazon获得 Mac OS X的Cocoa编程(第3版)

http://www.amazon.com/exec/obidos/ASIN/0321503619/bignerdranch-20

作者Aaron Hillegass自从接下来的几天开始使用Objective-C编程,现在教Cocoa编程为生。我拥有这本书,但我没有它,所以我不能告诉你现在要看的具体章节。但是,我可以向你保证这是一本好书。

我希望上述参考资料有助于您理解。

答案 2 :(得分:0)

您可能错过了两点:

  1. [NSString stringWIthString:theString]等工厂方法在内部执行相当于[[[NSString alloc] initWithString:theString] autorelease](或者可能是字面意思)。 autorelease与您引用的NSAutoReleasePool进行交互,主要是尝试在下一个事件循环周期中释放该对象。
  2. 所有Objective-C对象都是指针。不是直接使用mallocnew,而是从NSObject(Apple的Objective-C库中的根类,实际上在大多数Objective-C代码中)继承的Objective-C对象使用{{ 1}}代替直接内存管理调用。同样,在内部,这可能使用+(id)alloc来进行分配。

答案 3 :(得分:0)

Objective-C 2.0有一个垃圾收集器。

是NSString * aString;会为你做一些魔术幕后的东西。如果你想控制内存,你可以使用类似的东西:

NSString * aString = [[NSString alloc] init];

您是否阅读过“在Mac上学习目标C?”这有点过时,但不是我的。主要区别在于XCode。

答案 4 :(得分:0)

当然这个问题已经很久以前就被提出了,这里已经给出了很好的答案。 但目前至少其中一个已经过时 - 关于垃圾收集器

如果有人来这里寻找一本书,这里有一本: https://www.packtpub.com/application-development/objective-c-memory-management-essentials

我是合作者,是的,这就是为什么我无法通过.. :) 任何评论家都欢迎!