【问题标题】:Preventing to alloc the same array more than once防止多次分配同一个数组
【发布时间】:2011-09-02 01:42:24
【问题描述】:

一个初学者的问题:我有一个将数据放入 MutableArray 的方法。潜在地,这个方法可以被多次调用,我有点担心它会泄漏内存,因为我每次调用它时都在分配数组:

    indexContent = [[NSMutableArray alloc] init];

int numberOfEntries = [noteBookContent count]/3;

for (int k=0; k < numberOfEntries; k++) {
    IndexItem *newItem = [[IndexItem alloc] init];
    newItem.itemTitle = [noteBookContent objectAtIndex:(k*3)];
    newItem.itemPage = k;
    if (![[noteBookContent objectAtIndex:(k*3)] isEqualToString:@""]) {
        [indexContent addObject:newItem];
    }   
    [newItem release];
}

如果indexContent = [[NSMutableArray alloc] init]; 被多次调用,实际会发生什么?如果它很糟糕,我该如何防止这种情况发生?例如,我应该在 viewDidLoad 中调用它吗?但是,如果我尝试进行“延迟加载”,即仅在我真的需要时才分配 indexContent,我该怎么做?有没有办法检查它是否已经分配?

如果这一切都很明显,我很抱歉,但我正在努力解决这个问题。也许这是一个我还没有完全掌握的基本概念。谢谢!


编辑:

我有

@property (nonatomic, 保留) NSMutableArray *indexContent; 在我的标题中

【问题讨论】:

    标签: iphone objective-c cocoa-touch memory-management


    【解决方案1】:

    如果你调用你的函数的次数越多,你就会泄漏内存,因为你没有从之前的调用中释放已经分配的内存。简单的检查是这样的:

    if(indexContent)
      [indexContent release]
    

    阅读苹果的内存管理文档会对你有很大帮助。

    【讨论】:

      【解决方案2】:
      if (indexContent == nil) indexContent = [NSMutableArray new]; // i screwed up logic first time.  derp.
      

      确保在释放 indexContent 时将其设置为 nil;

      [indexContent release];
      indexContent = nil;
      

      (除非是dealloc 方法,但那里可能仍然是个好主意)

      请注意,这假设您要重复使用并可能进一步填充现有数组。如果没有,你可以removeAllObjects 或者你可以释放现有的并重新创建。


      或者,如果是@property,您可以:

      self.indexContent = [NSMutableArray array]; // not +new!!
      

      或者,在那个方法中:

      [indexContent release];
      indexContent = [NSMutableArray new];
      

      【讨论】:

      • 嗯...对不起,但我不太明白。 if (indexContent) indexContent = [NSMutableArray new];实际上呢?它检查是否有 indexContent - 即是否已经分配?如果是这样,它会分配一个新的?另外,我应该什么时候发布 indexContent?在我尝试分配它之前不久(如果已经有一个?)
      • 我搞砸了逻辑;应该是零检查。德普。
      【解决方案3】:

      环绕代码检查是否为 nil,如果为 nil,则分配数组

      //check if it has been allocated
      if(indexContent == nil)
      {
          indexContent = [[NSMutableArray alloc] init];
      
          int numberOfEntries = [noteBookContent count]/3;
      
          for (int k=0; k < numberOfEntries; k++) {
              IndexItem *newItem = [[IndexItem alloc] init];
              newItem.itemTitle = [noteBookContent objectAtIndex:(k*3)];
              newItem.itemPage = k;
              if (![[noteBookContent objectAtIndex:(k*3)] isEqualToString:@""]) {
                  [indexContent addObject:newItem];
              }   
              [newItem release];
          }
      }
      

      【讨论】:

        【解决方案4】:

        这取决于。 indexContent 是否声明为保留@property?如果是这样,运行时将负责释放先前的数组。如果没有,并且您没有明确释放它,那么是的,它会泄漏。

        您还应该确保在 dealloc 方法中释放 indexContext。

        编辑:正如@bbum 提到的,您必须使用点表示法。 self.indexContent = &lt;whatever&gt;; 忽略这一点我很糟糕。

        【讨论】:

        • 是的,我将它作为@property ...所以在这种情况下,我不需要担心?
        • 除非您使用点语法,否则 OP 不会这样做。
        猜你喜欢
        • 1970-01-01
        • 2010-09-28
        • 1970-01-01
        • 2018-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        相关资源
        最近更新 更多