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

帮助我理解Objective-C和Cocoa中的内存管理,objective-c,memory-management,Objective C,Memory Management,别向我开枪,我知道这个问题已经问了一千遍了 我对Objective-C内存缺乏良好的文档感到不舒服。我理解alloc、dealloc、retain、release和所有这些,但我的头脑中仍然有一些困惑 这仅仅是懒惰的编程,还是Objective-C在分配内存方面做了一些“幕后”的自动逻辑活动 来自C语言背景(几个世纪前),我知道指针只是指针。。。您还必须为指针指向的对象保留空间,否则您将开始踩踏自己的程序和其他变量 我找到的代码示例(以及我读过的书中的代码示例——遗憾的是,所有这些都与当前版本的

别向我开枪,我知道这个问题已经问了一千遍了

我对Objective-C内存缺乏良好的文档感到不舒服。我理解alloc、dealloc、retain、release和所有这些,但我的头脑中仍然有一些困惑

这仅仅是懒惰的编程,还是Objective-C在分配内存方面做了一些“幕后”的自动逻辑活动

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

我找到的代码示例(以及我读过的书中的代码示例——遗憾的是,所有这些都与当前版本的XCode和Interface Builder过时了)似乎从未为某些对象(如NSString)分配存储空间。它们声明一个指针(例如NSString*aString;),然后开始为字符串分配文本。每次调用时都没有为字符串分配内存!?!?那么,所有这些示例都只是寻找崩溃点的懒惰代码吗

此外,书中还谈到声明“池”内存,并将其自动插入到代码中。当我创建项目、类和对象时,在任何地方都找不到这样的代码。苹果是否已经放弃了这种自动插入,还是在编译时发生了什么


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

您应该阅读。

您可能遗漏了两点:

  • 工厂方法,例如
    [NSString-stringWIthString:theString]
    在内部相当于
    [[NSString-alloc]initWithString:theString]autorelease]
    (或者可能是字面意思)
    autorelease
    与您提到的
    NSAutoReleasePool
    交互,基本上是试图在下一个事件循环周期释放对象
  • 所有Objective-C对象都是指针。与直接使用
    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