0

下面的方法接受一个双指针NSString并用一个值填充它,如下所示:

@implementation Exp
- (int) func:(NSString**) dpStr
{
    //------
    *dpStr = [self func_2];
    //------
}

现在它被这样调用:

int main ()
{
   NSString * str = [[NSString alloc] init];
   int retCode = [Exp func:&str];
   // <----- Now here I'm able to access value returned by func ------->

   [str release];    //  <--- It is crashing here 
}

谁能解释它为什么会崩溃?

4

1 回答 1

4

这分配了一个空字符串:

NSString * str = [[NSString alloc] init];

这用一个显然已经自动释放的新字符串替换了之前的值;的旧值被泄露strstr

int retCode = [Exp func:&str];

这试图释放 的str,它已经平衡,所以它是一个过度释放并且发生了崩溃:

[str release];

在这种情况下,既不需要前导+alloc/-init也不需要尾随-release,因为对象由-func:. 所有你需要的是:

NSString *str = nil;
[Exp func:&str];
// use str normally

最好修改-func:为直接返回字符串:

NSString *str = [Exp func];
// use str normally

那么就不需要通过地址传递了。

于 2011-08-21T14:19:07.947 回答