我使用Xcode 4在iPhone iOS上开展项目。
使用Xcode>产品>分析我得到35个问题,所有这些类型:
myTextField.text = [[NSString alloc] initWithFormat:@"0.2f", abc];
问题是“在......分配的对象的潜在泄漏”
什么是违规对象?如何释放它?
谢谢
答案 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或者将其保留?,让我们看看发生了什么:
NSString
对象,保留计数为1 NSString
对象是前一个String的副本,但由于 NStrings
在这种情况下是不可变的,因此copy会返回相同的对象! ,因此NSString
实际上保留计数为2。