0

下面的方法需要一个双指针NSString并用值填充此,如下所示:释放返回的按引用的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

这种分配一个空字符串:

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

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

int retCode = [Exp func:&str]; 

这种尝试释放的str值,这已经是平衡的,所以它是一个overrelease和崩溃发生:

[str release]; 

在这种情况下,不需要领先的+alloc/-init也不需要尾随的-release,因为该对象由-func:提供。所有你需要的是:

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

更好的方式是修改-func:直接返回字符串:

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

那就没有必要通过地址传递给它。

+0

+1为更好的和详细的解答 – MByD

+0

如果我的NSMutableString取代的NSString和功能 做如下 - (INT)FUNC:(**的NSMutableString)dpStr { ------ [* dpStr setString:[self func_2]]; ------ } 然后我可以使用[str release]释放内存。 这个乐趣是在库中定义的,我从我的应用程序中调用这个乐趣,它与此库静态链接 推荐哪种方法... – macdev30

+1

推荐的方法是我在我的答案中描述的。在Objective-C中,你不需要为字符串等提供缓冲区。操作系统通常会为您处理它。 –