【问题标题】:Is it good idea of retained self object with allocation使用分配保留自我对象是个好主意吗
【发布时间】:2012-02-07 04:35:44
【问题描述】:

我正在做一些分配

self.xyz = [[NSDictionary alloc] init];

保留这样的财产是个好主意吗?或者

这样做会更好吗:

NSDictionary *zzz = [[NSDictionary alloc] init];
self.xyz = zzz;
[zzz release];

我担心的是,我看到了一些人们保留的地方,例如:

self.xyz = [[NSDictionary alloc] init];

这意味着保留计数是 2。那么将这里的计数减少到 1 的最佳方法是什么。

谢谢。只是想弄清楚一些内存管理概念再清楚一点。

【问题讨论】:

标签: ios objective-c memory-management autorelease


【解决方案1】:

这取决于您如何处理属性xyz。如果你这样做了

@property (nonatomic, retain) NSObject *xyz;

那么xyzNSDictionary 上有一个保留,所以第二个(3 行)版本是最好的。

【讨论】:

    【解决方案2】:

    我通常会这样做:

    self.xyz = [[[NSDictionary alloc] init] autorelease];
    

    或者如果这个类有一个方便的方法,那么像这样使用它:

    self.xyz = [NSDictionary dictionary];
    

    或者,在这种情况下,只需使用 ARC 并让它为您完成工作。

    【讨论】:

      【解决方案3】:

      我假设我们谈论的是不使用 ARC 时的最佳做法。

      在手动内存管理环境中,第一种方法是完全错误的,因为正如您所指出的,保留计数为 2。执行单行的正确方法如下:

      self.xyz = [[[NSDictionary alloc] init] autorelease];
      

      通过综合设置器(假设xyz 是使用retain 指令声明的),除了alloc/init 添加的1 之外,将保留计数加1。自动释放可以平衡这一点。

      您详述的第二种方法在功能上是等效的,但由于可用内存量相对较少,因此在嵌入式设备上被认为是一种更好的做法。您创建一个对象,将其分配给属性并立即释放原始临时对象。在前一种方法中,对象被放入自动释放池中,并在稍后的时间点释放。

      【讨论】:

      • 不等价。自动释放有更多的开销(当你自动释放它时把它放在自动释放池中;当你耗尽自动释放池时它必须做一个额外的操作)
      • 我说的是功能等价,意思是结果是一样的。您会注意到,在下一句中,我解释说最好严格控制嵌入式设备上的内存。无论如何,这一切都被 ARC 否定了。
      【解决方案4】:

      我认为您应该使用自动释放作为代码的最佳实践。

      【讨论】:

        【解决方案5】:

        第二种方法最好将保留计数保持为 1。

        【讨论】:

          【解决方案6】:

          您必须始终平衡内存管理方程,否则,您可能会出现内存泄漏。

          在您的示例中,它取决于 xyz 内存管理策略。

          如果 xyz 有保留策略,则保留计数为 2。这是一个常见的错误,您有内存泄漏。

          @property (retain, nonatomic) SomeClass* xyz;
          

          如果 xyz 有分配策略,则不会增加保留计数

          @property (assign, nonatomic) SomeClass* xyz;
          

          总之,如果您使用保留策略,您提供的第二个 sn-p 是正确的方法。显然你必须记住在 dealloc 方法中释放该属性。

          - (void)dealloc
          {
             [xyz release];     
             [super dealloc];
          }
          

          希望对你有帮助。

          【讨论】:

          • 但是,当您有分配策略时,保留计数为 1 也是错误的
          • @newacct 啊,我明白了。我的意思是保留计数为 1,因为它已使用 alloc-init 分配对象。将对象分配给具有分配属性的属性无效。我的回答不清楚吗?
          • @newacct 我修改了我的答案。你觉得更清楚吗?谢谢。
          • 没关系,你之前说的比现在更正确(它确实有保留计数 1)。只是它与使用分配属性的点不兼容
          【解决方案7】:

          在我看来,

          self.xyz = [NSDictionary alloc]
          

          会导致内存泄漏。您需要手动释放。

          你可以这样做

          xyz = [NSDictionary alloc]
          

          在那之后,即使我也有同样的问题。哪种方法更好?为什么?

          【讨论】:

          • 该代码只分配内存,不释放内存,也不初始化对象,所以更糟。
          • 这正是我的观点。因此我说它会导致内存泄漏。你甚至读过它吗?我没有处理初始化。稍后初始化有什么问题?
          • 第二种方法最好保持retain count为1。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-30
          • 2016-04-10
          • 2014-10-15
          • 1970-01-01
          • 1970-01-01
          • 2016-02-28
          • 2012-05-01
          相关资源
          最近更新 更多