gpt4 book ai didi

objective-c - 使用分配/保留/释放的可能场景?

转载 作者:行者123 更新时间:2023-12-02 05:54:37 33 4
gpt4 key购买 nike

我已经使用 ojective c 快一周了,我主要是一个 c++ coder。在我阅读了 Apple 的内存管理指南后,我尝试将我在 c++ 中的内存使用方式带入 objective-c ...如果我错了,请告诉我:)

我会尽量不使用autorelease,就我个人而言,通过使用autorelease,在某些自动释放池被耗尽之前,可能总会有一些冗余内存。我将只使用 release,它确保我的应用程序在任何时候都使用最少的内存。

Apple 说的另一件事(我用自己的话来描述)是:每次我添加保留/分配/复制时,我都应该在某处添加一个release

以下是我总结的所有场景:

  1. 在同一个函数中:分配一个对象,使用它,然后释放

  2. 在类的init函数中,alloc一个对象,在类的dealloc函数中,释放对象

  3. 当需要拥有一个指针时,应该在类的方法中保留一个输入指针(比如说方法A),然后< em>释放 类的dealloc 函数中的指针。

    我发现在objective c中使用retain的时机和在c/c++中使用memcpy的时机是一样的,所以我取retain 作为“内存有效副本”

    如果输入的保留指针要设置为成员指针变量,则应先释放成员指针。所以在 case[3] 中,类的 init 中的 allocmethod A 中的 release 配对,并且方法A中的retaindealloc

  4. 中的 release配对
  5. 返回一个指针作为返回值。老实说,当我使用 C++ 时,我从来没有做过这样的事情。如果返回一个成员指针也没关系,因为有人会处理它:

    -(UIButton*) getTheButton() {
    return theButton;
    }

    但是返回一个指向本地分配对象的指针真的很糟糕:

    -(UIButton*) getTheButton() {
    UIButton* myButton = [[UIButton alloc] init];
    return myButton; //TERRIBLE!
    }

    有人可能会说我应该在那种情况下使用自动释放,但我只是想通过使用这个来绕过该解决方案:我将只返回成员指针,或者我不会返回指针,我将只对给定的输入指针进行操作。

    -void operateOnTheButton(UIButton* button) {
    [button release];
    button = [[UIButton alloc] init];
    }

所以,如果我按照上面的内存使用说明进行操作,如果有任何问题,请告诉我。

谢谢:D

最佳答案

有一个重要的场景,您必须使用autorelease。如果您分配/保留/复制一个对象,然后将它返回给您拥有该对象的其他代码,但您不能释放它,因为其他代码需要使用它(否则您不会返回)。

在这种情况下,您必须通过向对象发送autorelease 消息来负责对象的释放,从而确保它最终会被释放。这正是像 NSString 的 stringWithString: 这样的基础方法所做的。您不必 release 从该方法获得的字符串对象,因为您没有分配/保留/复制它,但如果该方法没有为您自动释放它,它会在 [pool drain] 并成为内存泄漏。

确保您了解引用计数的工作原理。 release 减少对象的引用计数。当计数达到 0 时,对象将被销毁。 alloccopy 创建一个引用计数为 1 的对象。retain 将接收对象的引用计数递增 1。对于每个 alloc/retain/必须有一个 release。 1 上,1 下。

因此,当您返回一个您创建的对象并将控制权传递给被调用者时,您就失去了 1 对 1 的平衡,因为您无法释放它。这就是为什么有 autorelease。它不会减少接收者的引用计数器,因此没有被销毁的危险,但是当池被耗尽时,池中的每个对象都会为每个 autorelease 获取一个 release 消息> 它已经接收到,恢复平衡(除非一个对象被有意保留,这样它就可以在耗尽后幸存下来,在这种情况下,被调用者需要稍后释放它)。

至于第 4 点,如果您 autorelease,您的第二个示例就很好,基础类中有大量此技术的示例。每个数据类,如 NSString、NSArray、NSDictionary 等,都有返回本地分配的对象指针的方法。它们通常采用 thisWiththat: 形式,例如 stringWithstring:dictionaryWithContentsOfFile:。后者会分配一个字典对象,用文件的内容填充它,自动释放它,然后返回一个指针给你。它称为工厂功能。在 obj-c 和 java 中非常常见的模式。

您的第三个代码示例稍后会导致运行时错误。您正在释放不属于您的对象。所有者不会期望您release 它,这可能意味着它会收到过多的release 消息,从而导致运行时错误。如果您没有分配/保留/复制它,则您不拥有它,因此您不应该释放它。

关于objective-c - 使用分配/保留/释放的可能场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3315029/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com