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];