Objective c 如果我想在一个函数中创建一个对象的新实例,其指针是通过引用传递的

Objective c 如果我想在一个函数中创建一个对象的新实例,其指针是通过引用传递的,objective-c,Objective C,我应该如何使用释放或自动释放?我当然不想在函数之外释放:) 与其使用双指针,不如使用NSMutableString ... NSString *createStr; [self createAString:&createStr]; NSLog(@"%@", createStr); 或者,更好的方法是让createAString方法返回一个NSString NSMutableString *createStr = [[NSMutableString alloc] init]; [se

我应该如何使用释放或自动释放?我当然不想在函数之外释放:)


与其使用双指针,不如使用
NSMutableString

...
NSString *createStr;
[self createAString:&createStr];
NSLog(@"%@", createStr);


或者,更好的方法是让
createAString
方法返回一个
NSString

NSMutableString *createStr = [[NSMutableString alloc] init];
[self createAString: createStr];
NSLog(@"%@", createStr);
[createStr release];

不过,我不想假设你的需求就这么简单

使用此表单时,您通常希望从out参数返回自动删除(或类似)对象,这是正确的。将
*str
设置为字符串的函数中的赋值语句:

- (NSString *)createAString
{
    return @"Hi all!"; // this is autoreleased automatically
}
已经在做正确的事情,因为该方法返回调用方不拥有的NSString实例。正如您可以从函数中返回此字符串对象而无需任何进一步的内存管理一样,您也可以将其设置为outparam。显示调用站点的第二个代码片段很好


也就是说,我担心代码中的一些问题,您应该确保自己理解:

  • 方法内部的
    str
    值仍然是
    **
    ,发送消息(就像您为推测的
    自动释放所做的那样)是毫无意义的。在过度使用双间接指针之前,请确保您完全理解它们。:)如果在创建消息后需要发送
    str
    消息,请将其发送到
    *str
    ,该消息包含
    NSString*

  • 在函数返回void时设置这样的outparam不是惯用的方法。通常只需直接返回
    NSString*
    。可可中的前驱物很少见。(通常只是
    NSError
    s从框架调用中得到这种处理。否则,它们通常使用
    getString
    这样的名称来区别于不使用“get”一词的普通get访问器。)

  • 我希望
    -stringWithString
    只是一个例子。该方法几乎从未在实践中使用过,因为它(在本例中)等同于只使用
    @“string literal”
    (尽管这会使您的示例变得混乱)


  • 谢谢你的回答!!那
    [str自动释放]拼写错误:)当然是
    [*str autorelease]
    我使用一个函数返回多个内容:
    -(int)terminalExec:(NSString*)execPath参数:(NSArray*)args output:(NSString**)outString
    ,有时我需要任务的(终端)输出;有时候不是!我只是对发布问题感到困惑。通常地如果调用方拥有该实例,让我们用“…=[[NSString alloc]init]来说明我应该如何使用release/autorelease??再次感谢你!你所说的“如果调用方拥有该实例”到底是什么意思?您对该实例做了什么?您应该在方法内部显式地
    释放它,因为您在处理对
    stringWithString
    的引用后不再使用它。常规规则适用:如果你alloc/init它,释放它或自动释放它。但是再一次,不要在这里使用stringWithString。2件事:如果调用者没有提供一个outstring,你就泄露了字符串,因为自动释放只发生在条件内部。其次,在记录
    retainCount
    时要小心。如果您花时间在这里,就会发现它作为调试工具是出了名的不可靠。完成了!)我会记住
    retainCount
    问题!谢谢,谢谢!!谢谢你的回答。。。但是正如我提到的,我不想在函数之外创建实例,因为我并不总是需要它!我最初的需求是使用我在函数中要求的功能,如
    -(int)terminalExec:(NSString*)execPath arguments:(NSArray*)args output:(NSString**)outString
    ,其中它在终端中执行任务并返回执行状态(int)和我需要的终端输出。所以不是那么简单的需要:)再次感谢!在我看来,这并不是很优雅。要求调用方为您创建一个可变对象有点老土,通常不会这样做。不,利用方法可以返回值并使用它返回所需字符串这一事实会更优雅。
    NSMutableString *createStr = [[NSMutableString alloc] init];
    [self createAString: createStr];
    NSLog(@"%@", createStr);
    [createStr release];
    
    - (NSString *)createAString
    {
        return @"Hi all!"; // this is autoreleased automatically
    }
    
    *str = [NSString stringWithString:@"foo"];