【问题标题】:Memory Leak with NSUserDefaults and NSMutableArrayNSUserDefaults 和 NSMutableArray 的内存泄漏
【发布时间】:2011-05-27 23:52:10
【问题描述】:

我正在从存储在 NSUserDefaults 中的数据中定义一些 NSMutableArrays,如下所示:

    nameArray = [[[NSMutableArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"names"]]mutableCopy];

我在 dealloc 中释放。

nameArray 是在 @interface 内的视图控制器的头文件中定义的,因为它的范围应该是整个类。

似乎存在与之相关的内存泄漏(仪器泄漏实用程序告诉我)。

是否有人发现我正在做的事情有什么问题可能导致泄漏?

【问题讨论】:

    标签: objective-c ios cocoa memory-management memory-leaks


    【解决方案1】:

    摆脱mutableCopy 调用,您不需要它,因为您已经是alloc/init-ing 和NSMutableArray:

    nameArray = [[NSMutableArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"names"]];
    

    mutableCopy 是这里的罪魁祸首,因为它增加了接收者的保留计数(已经是 1),所以当您在 -dealloc 方法中调用 release 时,保留计数减少到 1,而不是 0。

    您不需要调用 mutableCopy,因为您将数组传递给 NSMutableArray 初始化程序,这会固有地使您的新数组可变。

    【讨论】:

    • 我本可以发誓我已经以相同的方式设置它减去可变副本,它一直给我错误说我试图改变一个非可变结构。也许我在此期间改变了一些东西。我会试一试,让你知道这是否有效。
    • 如果这样说,可能意味着您将 nameArray 定义为 NSArray,而不是 NSMutableArray。
    • 哇,没有更多的泄漏!非常感谢!我想我对何时使用 mutableCopy 感到困惑。当我遇到非可变问题时,这让我认为每次我需要一个可变数组时我都需要使用 mutableCopy。
    • Jaanus - 谢谢,但我很确定我已经将它定义为一个可变数组,但可能没有分配/初始化,并且在我添加 mutablecopy 在这种情况下它是不可变的。有人可以进一步解释吗?
    • mutableCopy 不会保留接收者,它会创建一个新对象——旧对象的副本。与copy 不同,如果不实际制作副本,这将无法有效完成; mutableCopy 必须始终实际制作可变副本。
    猜你喜欢
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多