【问题标题】:Memory Leak the second time the view loads视图第二次加载时内存泄漏
【发布时间】:2011-03-07 04:28:12
【问题描述】:

我一直在为这个内存泄漏而绞尽脑汁..

我的数据源是可变字典..我在 viewdidload 中加载。如果我不保留它。我无法在 cellforrowatindexpath 中访问它。但是当我保留它时..它显示为仪器中的内存泄漏。我尝试了很多不同的变化.. 似乎没有做对。

这是泄漏在“dict”和“plistPath”中的代码

` - (void)viewDidLoad { [超级viewDidLoad];

self.navigationController.navigationBarHidden = NO;

self.title = @"Messages & Lists";


NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

[plistPath release];
plistPath = [documentsDirectory stringByAppendingPathComponent:@"general.plist"];

NSFileManager *fileManager = [NSFileManager defaultManager];
[dict release];

if ( [fileManager fileExistsAtPath:plistPath] ) {

    dict = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath] ;


} else {
    dict = [NSMutableDictionary dictionaryWithCapacity:1];

    [dict setObject:@"NO" forKey:@"busyStatus"];
    [dict setObject:@"NO" forKey:@"replyToAll"];
    [dict setObject:@"NO" forKey:@"replyToList"];
    [dict setObject:@"NO" forKey:@"dontReplyToList"];

    [dict writeToFile:plistPath atomically:YES];


}

[tableData release];

tableData = [[NSMutableDictionary alloc] init];

[tableData setObject:[NSArray arrayWithObjects:@"Help",@"Set Default Message",@"Reply To All",[dict objectForKey:@"replyToAll"],nil] forKey:@"1"];
[tableData setObject:[NSArray arrayWithObjects:@"Reply to a List",[dict objectForKey:@"replyToList"],@"List of Contacts",nil] forKey:@"2"];
[tableData setObject:[NSArray arrayWithObjects:@"Don't reply to List",[dict objectForKey:@"dontReplyToList"],@"List of Contacts",nil] forKey:@"3"];


[dict retain];  
[plistPath retain];

}

`

第一次加载视图时没有泄漏。但如果我回来了。然后再次加载它泄漏的视图。

提前感谢任何可以帮助我的人。

【问题讨论】:

    标签: iphone objective-c cocoa memory-leaks


    【解决方案1】:

    看来是对的。 唯一让我感到困惑的是tableData。该 var 是否也在其他地方发布或分配?

    假设您确实将其分配到其他地方,而不是在 dealloc 中释放它,那么这些步骤不应该是:

    1. tableData 分配在其他地方。
    2. tableData在viewDidLoad中释放
    3. tableData 再次分配(计数器 1)。
    4. 退出视图,再次进入视图,tableData 再次分配,释放并在函数中分配(计数器二?)

    看起来有点远,但是。你能显示仪器的意思吗?

    【讨论】:

      【解决方案2】:

      我认为您应该在视图控制器的 dealloc 方法中释放您的字典,以便在释放 ViewController 时减少数据源的保留计数。

      使用后保留而不释放是内存泄漏的主要来源。

      【讨论】:

        【解决方案3】:

        您必须在视图控制器的 dealloc 方法中调用 [dict release]。

        【讨论】:

        • 好的,谢谢。这似乎解决了这个问题。我不知道我错过了它。
        • 经验法则:.h 中设置的所有属性(用于对象)都应在 dealloc 方法中释放。还有 NARC——New Alloc、Retain、Cop​​y——如果你做了其中之一,一定要稍后释放对象。
        猜你喜欢
        • 2016-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多