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

Big*_*her 0 cocoa memory-management objective-c nsstring nsmutablestring

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

- (NSMutableString *) generateString:(NSMutableArray *)myArray
Run Code Online (Sandbox Code Playgroud)

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

我的问题是:

  1. 返回NSString是否更为谨慎?

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

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

谢谢!

mpl*_*ert 5

  1. NSString在大多数情况下,我会回来.它的内存占用量略小,如果调用者需要一个可变副本,那么创建一个只是一种方法:mutableCopy.
  2. 你不仅应该而且必须自动释放的NSStringNSMutableString你的方法返回(至少如果你喜欢的名字在本例中的方法)!" 内存管理编程指南"列出了必须遵循的规则,以避免完全混乱并深入解释所有内容.所以看吧!
  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];
    
    Run Code Online (Sandbox Code Playgroud)

注意这两个**并且任何NSErrorvar可能是NULL和不是nil(所以你应该在方法的主体中检查它).