【问题标题】:Is this a retained or autorelease object?这是保留对象还是自动释放对象?
【发布时间】:2011-11-18 01:49:55
【问题描述】:

我已经在我的类的标题中声明了一个 MutableArray rqst_entries 作为属性,并且也合成了它。 在 viewdidload 我添加了以下代码:

self.rqst_entries = [NSMutableArray array];

它会将这个 ivar 变成自动释放并且可能更早地释放它(在调用 dealloc 之前)

感谢您的帮助,

斯蒂芬

【问题讨论】:

  • stackoverflow.com/questions/3953413/bad-practice-to-retain-self> 应该会有所帮助。
  • 请添加代码以说明您如何定义属性rqst_entries,因为每个人都在猜测此属性的内存模型。

标签: iphone ios ios4 nsmutablearray memory-management


【解决方案1】:

如果您已将您的财产定义为retaincopy,它将由 ivar 持有,您会没事的。另一方面,如果您将属性定义为 assigned,您将遇到问题,因为 [NSMutableArray 数组] 是自动释放的。

【讨论】:

    【解决方案2】:

    如果您的财产是 retaincopy,则不会。

    【讨论】:

      【解决方案3】:

      如果您的财产被保留,那么您就可以了。您已将一个自动释放的对象分配给您的属性,但此操作为您保留了它。

      【讨论】:

        【解决方案4】:

        [NSMutableArray 数组] 返回一个自动释放的对象。

        每个人的答案都是关于rqst_entries 的属性。基本上,您需要一个内存模型为retain 的属性。在某些情况下您可能希望使用copy,但这通常用于不可变类型(NSArray、NSString 等)。 NSMutableArray 是可变的(可以在数组中添加条目、删除条目和修改条目)。

        你想定义你的属性:

        @property (nonatomic, retain) NSMutableArray *rqst_entries;
        

        真正让人绊倒的部分是在属性分配中执行分配/复制/保留,例如:

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

        因为这会泄漏,除非随后发布

        [self.rqst_entries release];
        

        在这种情况下,最好的赋值方法是使用局部变量(至少在需要线程安全的情况下)。喜欢:

        NSMutableArray *myArray = [[NSMutableArray alloc] init;
        self.rqst_entries = myArray;
        [myArray release];
        

        我知道这是一个非常微不足道的例子,但它确实说明了这一点。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-16
          • 2011-09-19
          • 2011-08-29
          • 2011-07-01
          • 1970-01-01
          • 2011-03-01
          • 2011-12-15
          • 1970-01-01
          相关资源
          最近更新 更多