2010-05-27 35 views
2

我有一个通过循环解析文本的例程。在每个记录的末尾,我需要清除我的字符串变量,但是我读到someString = @“”实际上只是指向一个新字符串&导致内存泄漏。初始化/清除字符串变量的最佳方式可可

处理这个问题的最佳方法是什么?我应该使用可变字符串变量并在迭代之间使用setString:@“”吗?

+1

它取决于someString的第一个创建。如果这个人用someString = [[NSString alloc] init]定义它,那么做someString = @“”,它会泄漏内存 – vodkhang 2010-05-27 15:01:52

回答

1

你必须要小心,在这种情况下,你创建的NSString:(工厂方法)或(ALLOC init或(使用@“”)。

如果使用@“”,它是一个常量字符串,在这里看到:Constant NSString

如果使用[的NSString的alloc]初始化],你需要释放it.You只需要做[someString发行]

如果你使用类似[的NSString stringWithFormat:@” “],你不需要发布它,因为它已经被运行时自动发布了。

+0

格式化被破坏,希望这是清晰的 ------------ ---------------------------------------- 用retain属性声明的对象怎么样 @property(nonatomic,retain)NSString * someString; -------------------------------- 然后通过复制 指定一个值someString = [parsedCharacters copy]; ------------------ 并用一个常量字符串赋值清零 someString = @“”; 对不起,如果我的问题看起来很愚蠢,但是这里有点不对劲,那么retain属性应该有相应的版本,但是版本会导致崩溃。我搞砸了什么? – 2010-05-31 11:25:06

+0

1st:只有在使用self.someString时才会使用该属性,否则只是正常分配。现在,你不'使用自我。 第二:如果将someString分配给像@“”这样的常量字符串,则不应释放它,请再次查看链接。即使你使用self.someString = @“”,你也不应该释放它 – vodkhang 2010-05-31 15:46:36

+0

我想我终于明白这一点,如果我只是分配文字字符串和使用工厂方法,那么对象不需要被释放。即使它是用保留财产申报的,这是否正确? – 2010-07-05 13:19:05

0

由于NSString是不可变的,所以不能更改字符串的内容。通过用@“”初始化它,你实际上正在创建一个常量NSString对象。

您可以使用NSString本地到循环,并在循环结束时释放它 - 或者您可以使用NSMutableString来代替。我宁愿循环本地字符串,但。

for (; ;) { 
    NSString* str = [[NSString alloc] initWithFormat:@"%@", CONTENT]; 
    ... 
    [str release]; 
}