以下方法采用指向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
}
有谁可以解释为什么会崩溃?
答案 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
然后没有必要通过地址传递它。