【问题标题】:Is there a leak in this copy code?这个复制代码有泄漏吗?
【发布时间】:2011-01-10 03:49:06
【问题描述】:

这段代码有泄漏吗?

// Move the group
 Group *movedGroup = [[Group alloc] init];
 movedGroup = [[[[GroupList sharedGroupList] groups] objectAtIndex:fromIndex] copy];
 [[GroupList sharedGroupList] deleteGroup:fromIndex];
 [[GroupList sharedGroupList] insertGroup:movedGroup atIndex:toIndex];

 // Update the loadedGroupIndex pointer
 if (loadedGroupIndex < fromIndex & loadedGroupIndex >= toIndex) {
  loadedGroupIndex = loadedGroupIndex + 1;
 } else if (loadedGroupIndex > fromIndex & loadedGroupIndex < toIndex) {
  loadedGroupIndex = loadedGroupIndex - 1;
 } else if (loadedGroupIndex == fromIndex) {
  loadedGroupIndex = toIndex;
 }
 [movedGroup release]

【问题讨论】:

    标签: iphone memory-management memory-leaks


    【解决方案1】:

    第一个实例化的 Group 将泄漏。您丢失了对它的引用(分配movedGroup = ...)并且它没有标记为自动释放。您可以将前两行简化为:

    Group *movedGroup = [[[[GroupList sharedGroupList] groups] objectAtIndex:fromIndex] copy];
    

    它会做同样的事情,没有泄漏。

    【讨论】:

    • 说得对。 moveGroup 是分配的,这意味着它变成了一个指针,指向一块用于保存 Group 对象的内存。然后你指向远离那个对象,而是把它指向你的 copied 对象。这使得分配的 Group 对象挂起,没有任何东西指向它。如果您构建和分析您的项目,分析器会告诉您没有对您在第一行创建的对象进行任何操作,并且可能存在泄漏(确实如此)。
    • 是的,回想起来很明显。正是一个构建和分析向我指出了这一点。我只是想确保我正确理解它。感谢您的意见。
    猜你喜欢
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多