【问题标题】:Best way to initialise / clear a string variable cocoa初始化/清除字符串变量可可的最佳方法
【发布时间】:2010-05-27 14:52:33
【问题描述】:

我有一个通过循环解析文本的例程。在每条记录的末尾,我需要清除我的字符串变量,但我读到 someString = @"" 实际上只是指向一个新字符串并导致内存泄漏。

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

【问题讨论】:

  • 这取决于 someString 的第一次创建。如果那个人用 someString = [[NSString alloc]init] 定义它然后做 someString =@"",它会泄漏内存

标签: iphone initialization nsstring


【解决方案1】:

在创建 NSString 的情况下必须小心:(工厂方法)或(alloc init 或(使用@"")。

如果使用@"",则为常量字符串,见这里:Constant NSString

如果你使用[[NSString alloc] init],你需要释放它。你只需要做[someString release]。

如果你使用类似 [NSString stringWithFormat:@""] 的东西,你不需要释放它,因为它已经被运行时自动释放了

【讨论】:

  • 格式化被破坏,希望这是清晰的 ---------------------------------- ------------------ 使用保留属性 @property (nonatomic, retain) NSString *someString; 声明的对象怎么样? -------------------------------- 然后通过 copy someString = [parsedCharacters copy]; 赋值------------------ 并用常量字符串赋值 someString = @"";抱歉,如果我的问题看起来很愚蠢,但这里出了点问题,retain 属性应该有相应的版本,但该版本导致崩溃。我搞砸了什么?
  • 第一个:该属性仅在您使用 self.someString 时使用,否则,它只是一个正常的分配。现在,你不'使用自我。第二:如果你将someString分配给一个像@“”这样的常量字符串,你不应该释放它,请再看一个链接。即使你使用 self.someString = @"",你也不应该释放它
  • 我想我终于明白了,如果我只是分配文字字符串并使用工厂方法,那么不需要释放对象。即使是用retain属性声明的,对吗?
  • 使用文字字符串,这是正确的。工厂方法,使用时需要释放retain属性
【解决方案2】:

由于 NSStrings 是不可变的,你不能改变字符串的内容。通过使用 @"" 对其进行初始化,您实际上是在创建一个常量 NSString 对象。

您可以使用循环本地的 NSString,并在循环结束时释放它 - 或者您可以使用 NSMutableString 代替。不过我更喜欢循环本地字符串。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-09
    • 2022-01-03
    • 2017-11-01
    • 2019-08-02
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多