Objective c 目标-C NSString';内存管理

Objective c 目标-C NSString';内存管理,objective-c,memory-management,Objective C,Memory Management,可能重复: 我想知道这两个代码示例之间的区别 1: 2: 出于某种原因,Xcode Analyzer警告我选项#1可能会导致内存泄漏-因此当我将代码更改为选项#2时,分析器不会警告我 有人知道原因是什么吗 多谢各位 在第一个示例中,您分配了一个新的NSString,并将其传递,但没有释放它。您负责释放该字符串,当您首次分配该字符串时,该字符串的保留计数为+1 (忽略您的简单示例可能不会导致实际泄漏这一事实。但这不是重点,它仍然不是管理内存的正确方法)假设您不使用ARC [str releas

可能重复:

我想知道这两个代码示例之间的区别

1: 2: 出于某种原因,Xcode Analyzer警告我选项#1可能会导致内存泄漏-因此当我将代码更改为选项#2时,分析器不会警告我

有人知道原因是什么吗


多谢各位

在第一个示例中,您分配了一个新的NSString,并将其传递,但没有释放它。您负责释放该字符串,当您首次分配该字符串时,该字符串的保留计数为+1


(忽略您的简单示例可能不会导致实际泄漏这一事实。但这不是重点,它仍然不是管理内存的正确方法)

假设您不使用ARC

[str release]

线路是这里的关键。将该行添加到第一个示例代码段的末尾,然后查看是否得到相同的警告。在对象上显式调用
alloc
会增加引用计数-为了减少引用计数,应该调用
release


有关ARC的信息,请参见第一个示例中的问题:

NSString *someString = @"Blabla";
{...Some code...}
imageView.title = [[NSString alloc] initWithString:someString];
imageView.title = [[[NSString alloc] initWithString:someString] autorelease];
就是通过alloc/init分配一个字符串,并将其分配给
imageView.title
,这是一个
retain
属性。事实上,alloc将为您提供一个保留计数为1的对象;将其分配给
retain
属性也将增加其保留计数(2)。现在,当imageView最终解除分配时,其
dealloc
方法将释放
title
属性(从而将其保留计数减少1),但对象将不会解除分配,因为您没有机会再次调用
release
来平衡您自己的
alloc

这里需要注意的重要一点是,您正在指定一个
retain
属性;如果
title
不是retain属性,您的代码就可以了

以下是修复第一个示例的方法:

NSString *someString = @"Blabla";
{...Some code...}
imageView.title = [[NSString alloc] initWithString:someString];
imageView.title = [[[NSString alloc] initWithString:someString] autorelease];

它依赖于商品构造函数的使用,商品构造函数按照约定为您提供自动释放的对象


(第二个示例中的做法也是正确的,不过要稍微详细一些)。

可能重复、、以及更多。在选项2中,您已经发布了SD,而在选项1中,您没有。因此,这是一个警告。
imageView.title = [NSString stringWithString:someString];