【问题标题】:iOS loops and leaksiOS 循环和泄漏
【发布时间】:2014-02-16 17:04:00
【问题描述】:

我有一个循环,我想在每次迭代时重新定义数组的内容。我担心泄漏。这段代码有什么问题吗?

for (int i=0;i<numberOfReps;i++){
  NSArray *shuffledArray=[self shuffleArray:originalArray];
  // use shuffled array
}

感谢阅读!

编辑:

这里是 shuffleArray(感谢 Kristopher Johnson 来自 What's the Best Way to Shuffle an NSMutableArray?):

-(NSArray*)shuffleArray:(NSArray*)array{
    NSMutableArray *newArray=[NSMutableArray arrayWithArray:array];
    NSUInteger count = [newArray count];
    for (NSUInteger i = 0; i < count; ++i) {
        // Select a random element between i and end of array to swap with.
        int nElements = count - i;
        int n = (arc4random() % nElements) + i;
        [newArray exchangeObjectAtIndex:i withObjectAtIndex:n];
    }
    return [NSArray arrayWithArray:newArray];
}

(我正在使用 ARC。)

【问题讨论】:

  • 需要发布-shuffleArray方法的内容。到目前为止,您发布的代码没有泄漏。
  • 您可以通过创建自己的类并将 NSLog 语句放入 initdealloc 方法中轻松地进行测试。

标签: ios objective-c loops memory-leaks


【解决方案1】:

假设我们使用 ARC 并且 shuffleArray 方法很好,那么这段代码也可以。您发布的代码没有泄漏。

每个shuffledArray 在循环的每次迭代结束时都会被释放(除非您将其保存在其他地方)。而且只有一个originalArray


编辑:再次编辑后,假设我们使用 ARC,代码没有泄漏。 newArrayshuffleArray 返回后立即发布。 shuffledArray 在循环迭代结束时释放。 originalArrayfor 循环之外有引用,并一直保留在内存中,直到没有更多引用为止。

这里唯一可能的泄漏是您在循环的//use shuffled array 部分中对shuffledArray 执行的任何操作。

【讨论】:

  • 好的,太好了。感谢您的解释,非常感谢。
【解决方案2】:

这取决于。

只有当您确定 shuffleArray 方法返回一个 autoreleased 对象时,您的代码才不会受到损害(假设您没有使用 ARC)。

编辑: 看到您的代码更新后,无论您是否使用 ARC,都没有泄漏

【讨论】:

    猜你喜欢
    • 2013-12-06
    • 2011-03-06
    • 1970-01-01
    • 2013-02-11
    • 2011-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多