objective-c - 我应该如何正确释放这个 NSString ?

标签 objective-c memory-management nsstring release-management

代码:

- (void) foo : (NSString*) ori_string
{
    her_string = [ori_string copy];

    while ([her_string length]>0) 
    {
        her_string = [her_string substringFromIndex:1];
        //do something...
    }

    [her_string release];  //Here is the problem
}

大家好,

如果我像上面那样释放 her_string,分析器会说这是调用者此时不拥有的对象的引用计数的不正确减少

否则如果我不释放它,它说这是一个潜在的内存泄漏。

我应该在哪里以及如何发布它?谢谢你!

最佳答案

删除[her_string release] 行,并将autorelease 添加到copy

- (void) foo : (NSString*) ori_string
{
    her_string = [[ori_string copy] autorelease];

    while ([her_string length]>0) 
    {
        her_string = [her_string substringFromIndex:1];
        //do something...
    }
}

问题在于 copy 返回一个必须释放的字符串,而您通过调用 substringFromIndex 覆盖该字符串而丢失了对它的引用。丢失引用后,它永远无法正确释放,因此字符串的第一个复制版本会泄漏(如果 length > 0,否则您的代码会正确释放字符串)。

substringFromIndex 返回一个已经自动释放的字符串,因此您不必担心它,直到您希望该字符串在当前自动释放池之外保留​​。

关于objective-c - 我应该如何正确释放这个 NSString ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8530849/

相关文章:

ios - 缩放 CALayer 内容的大小

c++ - 用户调用 operator new 时的分配/对象详细信息拦截和收集问题

objective-c - 如何加入 [Number numberWithChar : c]'s into an NSString?] 的 NSArray

objective-c - 获取字符串的最后 2 个字符?

iphone - 自动释放池与垃圾回收有什么联系?

iphone - 在 Objective-C 中创建构造函数

objective-c - 需要在 Objective-C 中声明一个公共(public)实例变量

C 向/从磁盘写入/读取内存快照

linux - 如何从用户空间访问(如果可能)内核空间?

objective-c - 使用正则表达式评估重复部分的字符串