【问题标题】:Is this the right way to assign an autorleased Objective C object?这是分配自动租赁的 Objective C 对象的正确方法吗?
【发布时间】:2012-02-21 10:07:47
【问题描述】:

我在这里为一个对象分配同一对象的派生。这有什么问题吗?

NSString *urlString =[TBXML textForElement:tempElement];
urlString = [urlString stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
urlString = [urlString stringByReplacingOccurrencesOfString:@"&" withString:@"&"];

【问题讨论】:

    标签: objective-c memory-management nsstring


    【解决方案1】:

    是的,没关系。运行这段代码后,内存中会出现三个NSString对象:

    1. [TBXML textForElement:tempElement]创建的那个
    2. [urlString stringByReplacingOccurrencesOfString:@" " withString:@"%20"]创建的那个
    3. [urlString stringByReplacingOccurrencesOfString:@"&" withString:@"&"]创建的那个

    它们每个的保留计数都为 1,但会自动释放。由于您不保留对 1. 或 2. 的引用,因此您无法在之后增加它们的保留计数,因此在 run loop 的当前迭代结束时,它们将被自动释放,它们的保留计数将变为 0,它们将被释放。

    第三个在同一条船上,但你确实有它的引用,所以如果你做一些事情来增加它的保留计数(例如,将它分配给 strong@property 或将它添加到 @987654327 @) 那么它可能在运行循环的这次迭代之后继续存在。或者,如果您只是将它用作某个函数的参数(也许您稍后只是在NSString stringWithFormat: 中使用它,它将与其他两个一起被释放。

    【讨论】:

      【解决方案2】:

      没问题 - 没关系。

      如果您编写引用计数,那么您需要注意您的引用,静态分析器可以提供帮助。

      【讨论】:

      • 你能详细解释一下“如果你写你的引用计数,那么你需要注意你的引用,”
      • NSString * str = [[NSString alloc] initWithFormat:@"%i", 1]; \n str = [[NSString alloc] initWithFormat:@"%i", 1]; 会产生泄漏。
      猜你喜欢
      • 2019-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-19
      • 2016-06-12
      • 1970-01-01
      • 2011-12-13
      相关资源
      最近更新 更多