下面的方法接受一个指向 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
}
谁能解释一下为什么会崩溃?
最佳答案
这会分配一个空字符串:
NSString * str = [[NSString alloc] init];
这用显然已经自动释放的新字符串替换了str
的先前值; str
的旧值已泄露:
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
那就不用地址传了
关于objective-c - 释放按引用返回的 NSString 会导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7138760/