帮助我理解Objective-C和Cocoa中的内存管理
别向我开枪,我知道这个问题已经问了一千遍了 我对Objective-C内存缺乏良好的文档感到不舒服。我理解alloc、dealloc、retain、release和所有这些,但我的头脑中仍然有一些困惑 这仅仅是懒惰的编程,还是Objective-C在分配内存方面做了一些“幕后”的自动逻辑活动 来自C语言背景(几个世纪前),我知道指针只是指针。。。您还必须为指针指向的对象保留空间,否则您将开始踩踏自己的程序和其他变量 我找到的代码示例(以及我读过的书中的代码示例——遗憾的是,所有这些都与当前版本的XCode和Interface Builder过时了)似乎从未为某些对象(如NSString)分配存储空间。它们声明一个指针(例如NSString*aString;),然后开始为字符串分配文本。每次调用时都没有为字符串分配内存!?!?那么,所有这些示例都只是寻找崩溃点的懒惰代码吗 此外,书中还谈到声明“池”内存,并将其自动插入到代码中。当我创建项目、类和对象时,在任何地方都找不到这样的代码。苹果是否已经放弃了这种自动插入,还是在编译时发生了什么帮助我理解Objective-C和Cocoa中的内存管理,objective-c,memory-management,Objective C,Memory Management,别向我开枪,我知道这个问题已经问了一千遍了 我对Objective-C内存缺乏良好的文档感到不舒服。我理解alloc、dealloc、retain、release和所有这些,但我的头脑中仍然有一些困惑 这仅仅是懒惰的编程,还是Objective-C在分配内存方面做了一些“幕后”的自动逻辑活动 来自C语言背景(几个世纪前),我知道指针只是指针。。。您还必须为指针指向的对象保留空间,否则您将开始踩踏自己的程序和其他变量 我找到的代码示例(以及我读过的书中的代码示例——遗憾的是,所有这些都与当前版本的
是否有一本倒数第二的参考书或网站可以一劳永逸地解释这一切 您应该阅读。您可能遗漏了两点:
[NSString-stringWIthString:theString]
在内部相当于[[NSString-alloc]initWithString:theString]autorelease]
(或者可能是字面意思)autorelease
与您提到的NSAutoReleasePool
交互,基本上是试图在下一个事件循环周期释放对象malloc
或new
不同,从NSObject
继承的Objective-C对象(苹果Objective-C库中的根类,实际上在大多数Objective-C代码中)使用+(id)alloc
代替直接内存管理调用。同样,在内部,这可能使用malloc
进行分配Objective-C2.0有一个垃圾收集器 是的,是的;会为你做一些幕后的魔术。如果您想控制内存,可以使用以下方法: NSString*aString=[[NSString alloc]init]
你读过“在Mac上学习目标C”吗?它有点过时,但我不太喜欢。主要区别在于XCode。我认为理解Objective-C语言中内存管理的最佳参考是Objective-C 2.0编程语言,该语言以PDF格式从苹果下载,网址如下: 第3章分配和初始化对象讲述内存管理 关于Objective-C语言中内存管理的讨论不太详细,但更为简洁,可在下面的URL中找到Cocoa中内存管理的非常简单规则: 您关于NSString分配规则的具体问题将在该文章的标题保留计数规则下介绍 “使用便利构造函数创建的对象(例如NSString的stringWithString)被视为自动删除。” 另一本了解Cocoa编程的好书有很多例子和解释,它是MacOSX的Cocoa编程(第三版),可从Amazon获得: 作者Aaron Hillegass从第二天起就一直在用Objective-C编程,现在以教授Cocoa编程为生。我拥有这本书,但我身上没有,所以我现在不能告诉你要看的具体章节。不过,我可以向你保证,这是一本好书
我希望上述参考资料有助于您的理解。当然,这个问题很久以前就被提出了,这里已经给出了很好的答案。 但目前至少有一个已经过时了——关于垃圾收集器的 如果有人来这里找一本书,这里有一本: 我是那里的合著者,是的,这就是为什么我不能经过的原因:)
欢迎批评 如果可以的话,我会+10。这是Cocoa内存管理的终极资源。我建议学习内存管理,不要依赖垃圾收集。iPhone环境不支持垃圾收集。什么?声明NSString指针变量不会在幕后产生任何神奇的效果。谢谢大家。我发现了两个我将要研究的参考文献:核心基础的内存管理编程指南(如在一个响应中提到的),COCOA是内存管理编程指南,是的,我有“Mac OS X的COCOA编程”,但它是第二版。它帮助我启动了,但由于示例代码中的一些重大遗漏,我或多或少地放弃了它。如果您查看main.m,您会注意到main函数中的所有内容都已放入自动释放池中。。。。池不是一个“内存池”。相反,可以将其看作一个列表,用于跟踪标记为稍后释放的一组对象。当池被[pool drain]排空时,池中每个对象的保留值都会被检查,如果没有任何对象保留这些值,并且设置为自动释放,则该对象将被销毁。链接更改为for stepwise.com