潜在的内存泄漏

时间:2011-07-30 16:38:05

标签: iphone objective-c memory-management memory-leaks ios4

我使用Xcode 4在iPhone iOS上开展项目。

使用Xcode>产品>分析我得到35个问题,所有这些类型:

 myTextField.text = [[NSString alloc] initWithFormat:@"0.2f", abc];

问题是“在......分配的对象的潜在泄漏”

什么是违规对象?如何释放它?

谢谢

3 个答案:

答案 0 :(得分:5)

您正在泄漏您分配给myTextField.text的字符串。发生此分配时,正在制作副本(查看documentation中的属性定义)。在大多数情况下,当值是不可变的时(如NSStrings的情况),副本将为您提供一个实例,该实例指向与正在复制的对象相同的位置,并且保留计数递增1。

如果是您的代码:

myTextField.text = [[NSString alloc] initWithFormat:@"0.2f", abc];

您分配的字符串的保留计数为2。

您需要(1)释放,(或自动释放)字符串,或(2)使用NSString方便方法之一,例如: stringWithFormat:创建字符串。这将为您提供一个自动释放的字符串,因此您不必担心明确释放它。

(1)

NSString *str = [[NSString alloc] initWithFormat:@"0.2f", abc];
myTextField.text = str;
[str release]

myTextField.text = [[[NSString alloc] initWithFormat:@"0.2f", abc] autorelease];

(2)

myTextField.text = [NSString stringWithFormat:@"0.2f", abc]; // autoreleased

答案 1 :(得分:4)

您负责释放您在此处创建的字符串对象 - 因为您使用alloc / init。

设置字符串的最方便方法是使用返回自动释放字符串的类方法+stringWithFormat - 因此系统将在以后为您释放该字符串对象:

myTextField.text = [NSString stringWithFormat:@"0.2f", abc];

或者,如果您愿意,可以明确地写自动释放:

myTextField.text = [[[NSString alloc] initWithFormat:@"0.2f", abc] autorelease];

如果您不想使用自动释放,可以使用临时变量创建新字符串,并在为文本字段设置后释放它:

NSString *tempString = [[NSString alloc] initWithFormat:@"0.2f", abc];
myTextField.text = tempString;
[tempString release];

答案 2 :(得分:2)

问题在于UiTextFields的text属性声明为:

@property(nonatomic, copy) NSString *text

因此在这一行:

 myTextField.text = [[NSString alloc] initWithFormat:@"0.2f", abc];

创建一个新的NSString,保留计数为1,然后myTextField.text复制此对象并将其保留计数增加1或者将其保留?,让我们看看发生了什么:

  1. 使用alloc initWithFormat创建的NSString对象,保留计数为1
  2. NSString对象是前一个String的副本,但由于 NStrings在这种情况下是不可变的,因此copy会返回相同的对象! ,因此NSString实际上保留计数为2。