【问题标题】:Memory management and ownership when returning an NSString from a method从方法返回 NSString 时的内存管理和所有权
【发布时间】:2011-01-11 19:05:00
【问题描述】:

我正在 Objective-C 中编写一个方法,该方法基于 NSMutableArray 输入返回一个字符串。我不打算让调用者修改字符串,但也不在乎。该方法的当前签名为:

- (NSMutableString *) generateString:(NSMutableArray *)myArray

该项目目前是一个命令行基础工具,用于学习其中的技巧,但这最终将在 iPhone 应用程序中结束。

我的问题是:

  1. 返回 NSString 会更谨慎吗?

2) 当返回 NSMutableString 时,我应该使用 autorelease 吗?如果您建议我返回一个 NSString,那么如何修改返回它?

3) 如果我还想返回一个错误对象来识别是否发生了错误,也许是一个枚举和一个字符串,在这种情况下所有权如何工作?该方法不称为 alloc、new 或 copy,所以调用者怎么知道?除了上述方法中的字符串,我如何返回分配的错误对象?

谢谢!

【问题讨论】:

  • 只是一个注释,不知道它是否与您相关,但您可以从NSArray 获得NSString,如下所示:NSString *myString = [myArray componentsJoinedByString:@" "];
  • 谢谢菲利普,我不知道。这是一个巧妙的想法,但在这种情况下对我不起作用,因为有必要的逻辑会影响最终字符串的生成方式。

标签: objective-c cocoa memory-management nsstring nsmutablestring


【解决方案1】:
  1. 在大多数情况下,我会返回NSString。它的内存占用略小,如果调用者需要一个可变副本,创建一个只是一种方法:mutableCopy
  2. 您不仅应该而且必须自动释放您的方法返回的NSStringNSMutableString(至少如果您像示例中那样命名您的方法)! Memory Management Programming Guide 列出了您必须遵循的规则以避免完全混乱并深入解释所有内容。所以读吧!
  3. Foundation 框架使用NSError 类来描述错误。要“返回”附加参数,您的方法应如下所示:

    - (NSString *)generateString:(NSMutableArray *)myArray error:(NSError **)error
    {
        BOOL failed;
        // Do some fancy stuff, if the operation fails, failed is true
        if (failed == YES) {
            if (error != NULL) {
                *error = [NSError errorWithDomain:@"your_domain" code:123 userInfo:nil];
            }
            return nil;
        }
    
        return [yourString autorelease];
    }
    
    // ...
    
    // Calling your method
    NSError *error = nil;
    [someObject generateString:someArray error:&error];
    

注意两个**,任何NSError var 可能是NULL 而不是nil(因此您应该在方法的主体中检查这一点)。

【讨论】:

  • 请注意,应该是*error = [NSError,而不是&error = [NSError。另外,即使error == NULL,你仍然应该返回nil——我通常使用两个嵌套的ifs 来处理这种情况。不过,Thinkos 击倒了我们中最优秀的人——我猜这就是这里发生的事情!
  • 感谢您的提示 - *错误是正确的,当然 -,- 修复了代码中的两个问题。
【解决方案2】:

默认方法返回自动释放 NSString,我建议使用相同的行为。如果需要修改结果字符串,可以使用临时字符串。

【讨论】:

  • 我不知道你是什么意思“默认方法返回自动释放 NSString。”我在哪里可以看到这种默认行为?
  • 感谢 Nickolay,但我并不完全清楚您的意思。这如何适用于我的要求?
  • mplappert 以更好的方式描述了这个想法)
猜你喜欢
  • 1970-01-01
  • 2012-06-15
  • 2014-02-06
  • 2013-05-18
  • 1970-01-01
  • 2012-09-20
  • 2020-09-21
  • 2017-04-12
  • 2011-09-28
相关资源
最近更新 更多