【问题标题】:NSString variable: should it be released?NSString 变量:它应该被释放吗?
【发布时间】:2011-05-26 08:00:21
【问题描述】:

当我们创建 NSString 对象时,我需要释放它吗?

当我为我的应用程序运行静态分析器时,我得到以下信息

NSString *dataStr=[[NSString alloc] initWithData:receivedData encoding:NSASCIIStringEncoding]; 方法返回一个具有 +1 保留计数(拥有引用)的 Objective-C 对象

【问题讨论】:

标签: iphone iphone-sdk-3.0


【解决方案1】:

静态分析器之所以这么说是因为您的方法名称并不意味着该方法的调用者拥有您要返回的对象的所有权。有几个解决方案:

  1. 修改方法的名称,使其暗示返回对象的所有权,即这些名称暗示所有权,因为它们以单词“new”开头或包含单词“copy”:

    • - (NSString *) newDataString
    • - (NSString *) copyDataString

    如果您使用上述方法名称,则意味着该方法的调用者负责在对象完成后向对象发送release 消息。

  2. 修改您的方法,使其在使用autorelease 方法返回对象之前放弃对象的所有权:

    - (NSString *) dataString
    {
        NSString *tmp = [[NSString alloc] initWithFormat:@"%f", 2.444];
        return [tmp autorelease];
    }
    

    记住,每个alloc、copy 或retain必须与release 或autorelease 平衡(但不能同时使用!)。

  3. 阅读Cocoa Memory Management Rules。这些规则不是可选的,您必须遵守它们。规则也很简单。经过一些练习,它们将成为第二天性。

【讨论】:

    【解决方案2】:

    神奇的词是alloc、copy和retain:如果在创建对象或声明属性时使用它们中的任何一个,则需要release它。

    【讨论】:

    • @"string" 怎么样? (这些问题似乎是相辅相成的。
    • @"string" 是一个包含单词 string 的字符串。当您将其分配给一个变量时,如果您需要在此过程中使用alloc、copy 或retain 等词,则稍后您将不得不使用release 该变量。 @"string" 本身在分配给变量或传递给方法或其他东西之前实际上什么都不是。
    • @"string" 是一个NSConstantString 对象,您仍然可以执行[@"string" retain] 之类的操作,但它对于常量字符串是无操作的。
    • @dreamlax 够公平的。从“OP 对 Obj-C 的掌握有限”的角度来看,我只是想确保这个问题,“@"string" 怎么样不是来自@"string" 是某种其他类型的字符串变量的印象。
    【解决方案3】:

    是的,您需要释放它。每个具有保留计数的变量都必须释放。

    【讨论】:

      【解决方案4】:

      是的,您需要释放它。通常,每当您创建一个调用alloc 的对象指针时,您都需要调用release。

      【讨论】:

        猜你喜欢
        • 2011-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多