对象释放期间的问题
Posted
技术标签:
【中文标题】对象释放期间的问题【英文标题】:problems during object release 【发布时间】:2010-11-23 05:14:08 【问题描述】:我在何时以及要释放哪个对象时遇到了一些问题
你可以说我对这方面的了解较少
我有以下情况,请给我相应的答案
情况-1NSMutableString *str=[[NSMutableString alloc]initWithFormat:@"Hello World!"]; NSMutableArray *array=[[NSMutableArray alloc]init]; [数组添加对象:str];
现在,当我尝试释放 str 时,数组的使用会在未来受到影响......反之亦然 告诉我我可以同时释放吗?
情况2NSMutableString *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
返回一个保留字符串(如果你使用了alloc
和init
),你需要将它分配给一个中间指针,并在添加到str
之后释放它。
【讨论】:
你的意思是我的第二种情况没有问题(如果我返回一个自动释放字符串)? 不,您的第二个案例仍然有问题,因为您要重新分配str
两次。当您使用str=@HelloWorld!"
时,您初始化的第一个对象会丢失。我的回答将您的作业改为致电appendString
。
+1--- 我已经读到如果我们有 2 个字符串(都已初始化)并且如果我使用 Str1=Str2;那么你只需要释放其中一个吗?(如果有错误请纠正我)
如果我们谈论 IBoutlets..我应该释放它们吗?
您可能需要阅读指针。这是正确的,但那是因为 Str1 不是实际的字符串,它是指向该字符串的指针。如果你使用 Str1 = Str2,这意味着你有两个指向同一个字符串的指针,所以你只调用一次 release。在您的示例中,您有一个指向两个字符串的指针,因此其中一个字符串丢失了。【参考方案2】:
创建NSMutableString有什么需要可以直接使用NSString来实现这个目的
【讨论】:
以上是关于对象释放期间的问题的主要内容,如果未能解决你的问题,请参考以下文章