释放返回的引用NSString会导致崩溃

时间:2011-08-21 14:14:30

标签: objective-c ios memory-management nsstring return-by-reference

以下方法采用指向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 
}

有谁可以解释为什么会崩溃?

1 个答案:

答案 0 :(得分:4)

这会分配一个空字符串:

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

这个用一个显然已经自动释放的新字符串取代以前的str值; str的旧值泄露

int retCode = [Exp func:&str];

这会尝试释放已经平衡的str new 值,因此它会过度发布并发生崩溃:

[str release];

在这种情况下,不需要前导+alloc/-init或前导-release,因为对象由-func:提供。您所需要的只是:

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

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

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

然后没有必要通过地址传递它。