【问题标题】:abandoned memory被遗弃的记忆
【发布时间】:2013-01-24 10:55:58
【问题描述】:

在我的代码中:

    ABNewPersonViewController *c = [[ABNewPersonViewController alloc] init];
    [c setNewPersonViewDelegate:self];
    [c setDisplayedPerson:newPerson];
    CFRelease(newPerson);


    UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:c];
    [self presentModalViewController:nc animated:YES];

有些地方似乎是被遗弃的记忆,我发现了仪器。 有什么线索吗?

【问题讨论】:

    标签: ios memory-management memory-leaks modalviewcontroller abandoned-memory


    【解决方案1】:

    发布 c.已经在nc中保留了

    【讨论】:

    • 好的,但我用的是 ARC,所以只做 c=nil?
    【解决方案2】:

    尝试删除 CFRelease,并将 UINavigationController 设为 ivar。这就是 ARC 如何知道将导航控制器保留在内存中直到特定类被释放。

    ABNewPersonViewController *personViewController = [[ABNewPersonViewController alloc] init];
    [personViewController setNewPersonViewDelegate:self];
    [personViewController setDisplayedPerson:newPerson];
    
    //this line is not required
    //CFRelease(newPerson); 
    
    //UINavigationController *personNavigationController; define nc as ivar in the .h file.
    personNavigationController = [[UINavigationController alloc] initWithRootViewController:personViewController];
    [self presentModalViewController:personNavigationController animated:YES];
    

    如果您想遵循 Apple 的一些命名约定,那么您的代码的可读性肯定会很好。

    【讨论】:

    • 您好,感谢您的回复,但情况更糟,废弃的内存增长得更快。如果我理解正确,所有 C 函数都不会在 ARC 中发布。我不需要发布 newPerson 吗?
    • 好的。在我看来,“newPerson”是一个客观的 C 类对象。所以我要求你不要照顾发布它,因为 ARC 会为你发布它。通常 new 不应该以变量为前缀。它混淆了静态分析器(new、init、alloc 将告诉编译器对象的所有权)。你能试试这2件事吗? 1) 更改 newPerson 变量的变量名。 2)制作一个Objective C模型来存储那个新的人对象(这样你就不用担心CFRelease ..)
    • newPerson 被声明为调用地址簿,以便我可以在地址簿中添加新联系人。即使在 Apple 教程中,整个库也是 C 类。问题是在每个教程程序中都会自动添加联系人,但我想打开地址簿并向用户显示他将添加到他的联系人中的内容。我猜这个问题出在某些控制器上,因为内存中的对象是视图连接的。以前的答案是保留其中一个控制器,但我不知道如何处理它。你有什么提示吗?
    猜你喜欢
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 2021-05-23
    • 2011-06-25
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 2018-07-08
    相关资源
    最近更新 更多