从方法返回NSString时的内存管理和所有权

时间:2011-01-11 19:05:01

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

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

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

该项目目前是一个命令行基础工具,以便学习绳索,但这最终将最终出现在iPhone应用程序中。

我的问题是:

  1. 返回NSString是否更为谨慎?
  2. 2)当我返回NSMutableString时,我应该使用autorelease吗?如果你建议我返回一个NSString,它如何修改返回它?

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

    谢谢!

2 个答案:

答案 0 :(得分:5)

  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];
    
  4. 请注意两个**,并且任何NSError var可能是NULL而不是nil(因此您应该在方法的正文中检查这一点)。

答案 1 :(得分:1)

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