【问题标题】:regarding use of nonatomic and retain property关于使用非原子和保留属性
【发布时间】:2012-03-06 12:24:05
【问题描述】:

我在 AppDelegate 中有一个 NSMutableArray 我正在使用属性(非原子,保留) 并合成它

再次在 didfinishlaunch 中使用 [[nsmutablearray alloc]init];

所以,我怀疑我是否使用 release 方法在 deallloc 中释放它。 是否正确发布? 或仍然保留计数。 如果我做错了,请提供适当的解决方案。

【问题讨论】:

  • 如果这是一个新项目,请开启 ARC。

标签: iphone objective-c ios


【解决方案1】:

这取决于您如何分配它。如果您的任务是直接分配给 ivar,例如

myProperty = [[NSMutableArray alloc] init];

然后在 dealloc 中进行一次释放就足够了,因为您从分配中获得了 1 的预期保留计数。

另一方面,如果您通过以下任一方式使用了合成设置器:

[self setMyProperty:[[NSMutableArray alloc] init]];

self.myProperty = [[NSMutableArray alloc] init];

那么您几乎可以肯定泄漏了该对象。您将保留计数增加了两次(一次通过 alloc 一次在 setter 中)并且只减少了一次(在 dealloc 中)。

最好的 IMO 是使用 setter 和自动释放池:

self.myProperty = [[[NSMutableArray alloc] init] autorelease];

这里alloc 与本地自动释放平衡,setter 的保留与释放释放平衡。

虽然该方法涉及两个额外的方法(setter 方法和 autorelease 调用),但它确保以前在属性中设置的任何保留值都是 released 必要时(在 setter 方法中)。

【讨论】:

    【解决方案2】:

    是的,你仍然需要在 dealloc 中释放它。 这两页是 iOS/Cocoa 开发者关于内存管理的必读文章

    https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/uid/20000994-BAJHFBGH

    https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

    对于您的具体示例,请参阅第二个链接上名为“实施 dealloc 以放弃对象所有权”的部分

    这也是 Stack Overflow 上解决的此问题的链接: Understanding reference counting with Cocoa and Objective-C

    【讨论】:

      【解决方案3】:

      如果你这样做:

      my_property = [[NSMutableArray alloc] init];
      

      “my_property”假定您拥有您的阵列。您的类的 dealloc 方法必须释放数组以防止泄漏。

      [my_property release];
      

      -或-

      self.my_property = nil;
      

      【讨论】:

        【解决方案4】:

        如果你正在使用

        [self setMutableArray:[[nsmutablearray alloc] init]];
        

        在这种情况下,它将释放之前分配给它的所有内存(放弃所有权)。 所以在 dealloc 方法中,你只是 写作

        self.mutableArray = nil; 
        

        然后它会放弃所有权,分配给 mutableArray 的内存会自动释放

        【讨论】:

          【解决方案5】:

          在您的情况下,保留计数将为 2,并且数组不断释放。设置属性后,您不需要对其进行初始化。

          【讨论】:

            猜你喜欢
            • 2012-03-18
            • 1970-01-01
            • 2011-07-06
            • 1970-01-01
            • 2010-12-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多