objective-c - 释放按引用返回的 NSString 会导致崩溃

标签 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 
}

谁能解释一下为什么会崩溃?

最佳答案

这会分配一个空字符串:

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/

相关文章:

ios - 如何在 Xcode Storyboard上显示一段文字?

python - 如何在 Mac 上安装枕头?

C - 字符串数组(二维数组)和内存分配给我带来了不需要的字符

c# - .net中Contiguous memory存储的误区?

iphone - 在 Xcode 项目中实现 Facebook

objective-c - 仅在 iOS 7 上运行时,Storyboard 原型(prototype)单元(Xcode 6、iOS 8 SDK)中的 UICollectionViewCell contentView 框架的自动调整大小问题

iphone - 将 10 MB JSON 响应转换为 NSDictionary 的最有效方法是什么?

ios - 在 Swift 中设置 UITextField 的最大金额限制

scala - 重用案例类的实例

iphone - 带有BOOL变量的init方法的 cocoa 风格指南?