内存保留和释放

Posted

技术标签:

【中文标题】内存保留和释放【英文标题】:Memory retain and release 【发布时间】:2012-07-02 03:41:03 【问题描述】:

我想知道,如果我做得正确,关于下面的数字按钮参考的保留和释放。在“由 stephen kochan 编写的目标 C 编程”一书中,它在一节中用不同的例子说,就像 digitbutton 持有对发送者持有的同一个对象的引用,所以在这之间发送者可能会在其他地方被释放,然后我会调用 currenttitle 方法在解除分配的数字按钮上,如果是这样的话。所以在这里我在digitbutton上调用了retain,在使用它之后我调用了release。好吧,示例可能不是出于此目的,但这个概念是否有效?我应该练习保留如下示例中的对象吗?如果我错了,你能帮帮我吗?我没有编写托管代码的经验。

- (IBAction)clickDigit:(id)sender 
    UIButton *digitButton = (UIButton*)sender;
    [digitButton retain];
    NSLog(@"%@",[digitButton currentTitle]);
    [[self displayOutput] setText:[digitButton currentTitle]];
    [digitButton release];

谢谢。

是的例子是错误的,假设如果不是 id sender 而是 NSString 而不是 UIButton,相同的 NSString,并且返回类型只是 void。那么我是否必须保留发件人 NSString 以防万一持有其引用的人释放它。 注意:我没有使用 ARC

【问题讨论】:

在您的方法运行时如何释放发件人? 【参考方案1】:

你不需要保留和释放它。

你可以这样做

 - (IBAction)clickDigit:(UIButton *)sender 
 

    NSLog(@"%@",[sender currentTitle]);
   [[self displayOutput] setText:[sender currentTitle]];

 

【讨论】:

【参考方案2】:

您在clickDigit: 中所做的事情是不必要的。

我不会解释为什么没有必要,而是直接指出我在哪里学习了正确的内存管理技术:Advanced Memory Management Programming Guide

【讨论】:

Re: "unnecessary": 注意 ARC 显然做同样的事情,不过(保留方法参数):***.com/questions/10310441/… 事实上,你最好解释一下为什么它是不必要的。所以答案应该大部分是独立的,仅使用链接作为备份。 @thilo 如果您使用的是优化构建,则不会。此外,arc 不会在对象上调用 release/retain,而是在 ObjC 运行时调用更轻量级的处理程序(因此不需要 IMP 查找或其他动态内容) 所以我不应该像上面的例子那样被调用 release 和 retain 所困扰?谢谢 @bloodwing 如果您知道可能存在导致对象在您使用时被释放的竞争条件,则不会。如果你不使用多线程,你完全没问题,如果你使用多线程,你可能会被你的锁定机制保存(但检查你的代码)

以上是关于内存保留和释放的主要内容,如果未能解决你的问题,请参考以下文章

目标 C:保留/释放内联分配的对象

如何在 iPhone / iPad 的应用程序中正确使用保留和释放

为啥保留/释放而不是新/删除?

[UINavigationController 保留]:发送到已释放实例的消息

深入了解保留周期

从 NSArray objectAtIndex 返回的 NSString 是自动释放还是保留