不要开枪,我知道这一定要问过一千次......
我对Objective-C内存缺乏良好的文档感到不舒服。我理解alloc,dealloc,retain,release等等,但是脑子里还有一些混乱。
它只是懒惰的编程还是Objective-C在分配内存方面做了一些'幕后'自动化活动?
来自C背景(几个世纪以前),我知道指针只是指针......你还必须为指针指向的位置保留空间,否则你将开始踩踏自己的程序和其他变量。
我找到的代码示例(在我读过的书中 - 所有这些都与当前版本的XCode和Interface Builder完全不同)似乎永远不会为某些对象(如NSString)分配存储空间。它们声明一个指针(例如NSString * aString;)然后开始为字符串分配文本。每次调用都没有为字符串分配内存!?!?所有这些例子都只是懒惰的代码寻找崩溃的地方吗?
此外,书籍谈论声明“池”内存并且它会自动插入到代码中。当我创建项目,类和对象时,在任何地方都找不到这样的代码。 Apple是否已完成此自动插入,还是在编译期间发生了什么?
是否有倒数第二个参考书或网站可以一劳永逸地解释这一切?
答案 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)
您可能错过了两点:
[NSString stringWIthString:theString]
等工厂方法在内部执行相当于[[[NSString alloc] initWithString:theString] autorelease]
(或者可能是字面意思)。 autorelease
与您引用的NSAutoReleasePool
进行交互,主要是尝试在下一个事件循环周期中释放该对象。malloc
或new
,而是从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
我是合作者,是的,这就是为什么我无法通过.. :) 任何评论家都欢迎!