【问题标题】:How to manage memory with ARC mode如何使用 ARC 模式管理内存
【发布时间】:2013-02-07 05:58:00
【问题描述】:

我正在创建一个 ios 应用程序并启用了 ARC 模式。 我将 24 个实例加载到 ScrollView,但在给定时间只会显示三个视图。因此,我将删除已加载到内存中的其他不需要的实例

if((NSNull *)[viewControllers objectAtIndex:2] != [NSNull null]) {
    [viewControllers replaceObjectAtIndex:2 withObject:[NSNull null]];
    [content3.view removeFromSuperview];
    //remove third content page
    [content3 viewDidUnload];
    //set nil to instance to memory management
    content3 = nil;

    NSLog(@"Content 3 removed");
}

但是当我用分析器检查时,内存不会被释放,它只是自动增加。

谁能给我一些关于这个问题的提示?

谢谢

【问题讨论】:

  • 手动调用 removeFromSuperviewviewDidLoad 看起来很讨厌。
  • viewDidUnload 调用不是必须的,也不建议自己调用。

标签: iphone objective-c automatic-ref-counting


【解决方案1】:

我认为你的代码有很多问题:

  1. 一个重要的问题是,您正在调用委托方法viewDidUnload。永远不要尝试做这样的事情,否则你会在你的应用中遇到奇怪的行为。
  2. 如果您需要从内存中删除一个对象,只需将其设置为 nil。
  3. 我认为您的 if 条件永远不会起作用,您为什么要将其类型转换为 NSNull ?

检查此代码:

if([viewControllers objectAtIndex:2] != [NSNull null])
{
    [viewControllers replaceObjectAtIndex:2 withObject:[NSNull null]];
    [content3.view removeFromSuperview];
    content3 = nil;
    NSLog(@"Content 3 removed");
}

【讨论】:

  • 指针的转换不会导致操作上的差异,因为指针比较总是会查看地址,但由于objectAtIndex:返回类型id,所以不需要。
  • 嗨。谢谢回复 。我根据您的消息来源更改了我的 if 条件,但是。仍然当我检查分配时。 thr 没有关于内存的法令
猜你喜欢
  • 2012-11-15
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 2013-10-03
  • 2013-06-08
  • 1970-01-01
相关资源
最近更新 更多