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

Objective c 释放引用返回的NSString会导致崩溃,objective-c,ios,memory-management,nsstring,return-by-reference,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:&s

以下方法获取指向
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 
}
int main()
{
NSString*str=[[NSString alloc]init];
int retCode=[Exp func:&str];

//这将分配一个空字符串:

NSString * str = [[NSString alloc] init];
这将用一个新字符串替换以前的
str
值,该字符串显然已经自动删除;
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

这样就不需要按地址传递它。

这将分配一个空字符串:

NSString * str = [[NSString alloc] init];
这将用一个新字符串替换以前的
str
值,该字符串显然已经自动删除;
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

然后就不需要按地址传递了。

如果我用NSMutableString替换NSString,并在函数-(int)func:(NSMutableString**)dpStr{-----------[*dpStr setString:[self func_2]];-----}中执行以下操作,那么我就可以使用[str release]释放内存。这个乐趣是在库中定义的,我从我的应用程序中调用这个乐趣,该应用程序与这个库静态链接。推荐的方法是我在回答中描述的。在Objective-C中,您不需要为字符串等提供缓冲区;操作系统通常会为您处理它。请建议我应该为iOS应用程序采取哪种方法我已经这样做了。iOS与这里的任何其他Objective-C目标没有区别。如果我用NSMutableString替换NSString,并在函数中执行以下操作—(int)func:(NSMutableString**)dpStr{-----------[*dpStr setString:[self func_2]];-----}然后我可以使用[str release]释放内存。这个乐趣是在库中定义的,我从我的应用程序中调用这个乐趣,该应用程序与这个库静态链接。推荐的方法是我在回答中描述的。在Objective-C中,您不需要为字符串等提供缓冲区;操作系统通常会为您处理它。请建议对于iOS应用程序我应该采取哪种方法我已经做到了。iOS与这里的任何其他Objective-C目标没有区别。