【问题标题】:How to return correctly a NSMutableString from a method如何从方法中正确返回 NSMutableString
【发布时间】:2009-12-02 20:38:43
【问题描述】:

我正在寻找一种返回由 NSMutableString 构造的字符串避免泄漏的好方法:

例如:

+(NSString *)myMethod{



 NSMutableString *numberToReturn = [[NSMutableString alloc] init];
 [numberToReturn appendString:@"lorem ipsum"];


 return numberToReturn;
}

泄漏仪器说我有这个变量泄漏。

我尝试了自动释放,但它崩溃了 我试图返回一个副本或将可变字符串复制到一个 nsstring 中,但泄漏仍然存在。

有什么想法或技巧吗? 每次用户在文本字段中键入值时,我都必须调用此方法,因此应用程序由于内存管理不良而崩溃...

谢谢

【问题讨论】:

    标签: iphone objective-c sdk nsmutablestring


    【解决方案1】:

    您应该使用-autorelease。你的方法应该写成:

    + (NSString*)myMethod {
        NSMutableString *stringToReturn = [[NSMutableString alloc] init];
        [stringToReturn appendString:@"lorem ipsum"];
    
       return [stringToReturn autorelease];
    }
    

    如果发生崩溃,则故障在别处。

    当然,您可以使用返回已自动释放实例的工厂方法,将您的方法重写为

    + (NSString*)myMethod {
      NSMutableString *result = [NSMutableString string];
      [result appendString:@"lorem ipsum"];
    
      return result;
    }
    

    或者更好的例子,

    + (NSString*)myMethod {
        NSMutableString *result = [NSMutableString stringWithString:@"lorem ipsum"];
        //...do something with result;
        return result;
    }
    

    显然,如果您的方法的唯一目的只是返回一个带有字符串的新字符串,那么您可以避免使用整个方法,如果您确实需要一个可变字符串,请使用 [NSMutableString stringWithString:@"lorem ipsum"]

    【讨论】:

    • 只是为了澄清“如果发生崩溃,则故障在其他地方”。您应该确保不要在其他地方释放自动释放的对象。该方法返回的字符串会在 autoreleasepool 释放时释放(通常是 run loop 的每个循环)。如果你在某处释放它,然后自动释放池也尝试释放它,你的程序将会崩溃。每次保留对象时自动释放或释放。
    【解决方案2】:

    您应该在返回之前自动释放字符串。这就是the memory management rules 所说的。如果您的应用随后崩溃,则表明您的代码中的其他地方存在错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      • 2017-02-20
      • 2012-11-10
      • 2023-03-10
      相关资源
      最近更新 更多