对象释放期间的问题

Posted

技术标签:

【中文标题】对象释放期间的问题【英文标题】:problems during object release 【发布时间】:2010-11-23 05:14:08 【问题描述】:

我在何时以及要释放哪个对象时遇到了一些问题

你可以说我对这方面的了解较少

我有以下情况,请给我相应的答案

情况-1

NSMutableString *str=[[NSMutableString alloc]initWithFormat:@"Hello World!"]; NSMutableArray *array=[[NSMutableArray alloc]init]; [数组添加对象:str];

现在,当我尝试释放 str 时,数组的使用会在未来受到影响......反之亦然 告诉我我可以同时释放吗?

情况2

NSMutableString *str=[[NSMutableString alloc]init]; str=@"你好世界!"; str=[自我获取数据]; //调用返回字符串的方法 [str 释放];

我想我在这里造成了内存泄漏(如何解决?)

请清除这些情况

【问题讨论】:

【参考方案1】:

在第一种情况下,您需要在将其添加到数组后调用[str release];,如下所示:

NSMutableString *str = [[NSMutableString alloc] initWithString:@"Hello World!"];
NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:str];
[str release];

这样,array 持有对字符串的唯一保留调用。一旦您稍后释放array,您将不会有任何内存泄漏问题。

我对第二种情况有点困惑。 str 这是一个指针。您似乎将三个不同的对象分配给同一个指针:

NSMutableString *str = [[NSMutableString alloc] init]; //first object
str=@"Hello World !"; //second object
str=[self getData]; //third object

当您调用[str release] 时,您已经创建了内存泄漏,因为您丢失了第一个可变字符串。第二次调用str =,您就无法访问第一个NSMutableString

假设您希望连接所有这些(因为您选择了 NSMutableString),您可以试试这个:

NSMutableString *str = [[NSMutableString alloc] init]; //first object
[str appendString:@"Hello World!"];
[str appendString:[self getData]];
[str release];

如果[self getData] 方法返回一个自动释放的字符串,你会没事的。如果getData返回一个保留字符串(如果你使用了allocinit),你需要将它分配给一个中间指针,并在添加到str之后释放它。

【讨论】:

你的意思是我的第二种情况没有问题(如果我返回一个自动释放字符串)? 不,您的第二个案例仍然有问题,因为您要重新分配 str 两次。当您使用str=@HelloWorld!" 时,您初始化的第一个对象会丢失。我的回答将您的作业改为致电appendString +1--- 我已经读到如果我们有 2 个字符串(都已初始化)并且如果我使用 Str1=Str2;那么你只需要释放其中一个吗?(如果有错误请纠正我) 如果我们谈论 IBoutlets..我应该释放它们吗? 您可能需要阅读指针。这是正确的,但那是因为 Str1 不是实际的字符串,它是指向该字符串的指针。如果你使用 Str1 = Str2,这意味着你有两个指向同一个字符串的指针,所以你只调用一次 release。在您的示例中,您有一个指向两个字符串的指针,因此其中一个字符串丢失了。【参考方案2】:

创建NSMutableString有什么需要可以直接使用NSString来实现这个目的

【讨论】:

以上是关于对象释放期间的问题的主要内容,如果未能解决你的问题,请参考以下文章

ios:ARC中的过度释放对象[关闭]

iphone中的对象释放问题

在 dealloc 中调用 self 的方法

使用 Mutex 同步 C# 对象:在 C# 对象析构函数中调用 ReleaseMutex() 时出现问题

在自我分配期间,复制和交换习语如何工作?

Jmeter什么时候发布对象?