【问题标题】: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 释放];

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

请清除这些情况

【问题讨论】:

    标签: objective-c object release-management


    【解决方案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来实现这个目的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多