ios - NSDictionary 泄漏内存

标签 ios memory-leaks nsdictionary

我的代码有一个问题,我一辈子都弄不明白,甚至连 SO 上的所有以前的线程都弄不明白。 我从 JSON 源中提取数据并将其放入 NSDictionary 中,如教程和 SO 中所述。在分析应用程序时,我注意到此 NSDictionary 导致内存泄漏,但在此函数结束时释放它会使应用程序崩溃。有什么建议么? (顺便说一下:我是 Obj-C 和一般编程的新手,所以这段代码主要是从各种来源中挑选出来的。)

- (void)fetchedData:(NSData *)responseData {
    //parse JSON for empty return
    if([responseData length] != 0){

        NSError* error = nil;
        //Convert JSON data to Obj-C
        NSDictionary* allShotData = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];

        NSString *player = [[allShotData objectForKey:@"player"] objectForKey:@"name"];
        NSString *shotDribbblePage = [allShotData objectForKey:@"url"];

        NSString *shotTitle = [allShotData objectForKey:@"title"];
        NSURL *imageURL = [NSURL URLWithString:[allShotData objectForKey:@"image_url"]];
        shotPageURL = [shotDribbblePage retain];


        //***********************
        //  Setup a-sync loading of shot
        //***********************

        NSOperationQueue *queue = [NSOperationQueue new];
        NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadImage:) object:imageURL];   
        [queue addOperation:operation]; 
        [operation release];
        [queue release];
    }
    else{
        airballCount++;
        if (airballCount <= 20) {
            [self getDribbbleData];
        }
        else{
            NSLog(@"Too many airballs. Bailing out");
            [self showNoConnectionModal];
        }
    }
}

最佳答案

这里:

shotPageURL = [shotDribbblePage retain];

您可能应该使用访问器:

self.shotPageURL = shotDribbblePage;

我应该真的强调你应该在任何地方使用你的访问器,因为它们会为你计算引用(异常(exception):不在初始化器和 dealloc 中)。正如 beryllium 还指出的那样,如果没有访问器,您可以手动进行引用计数。这采用基本形式:

[shotPageURL release];
shotPageURL = [shotDribbblePage retain];

如果泄漏的是返回字典的内容,那么就是您在读取时使用/引用内容的方式(过度保留)。

如果您在并发上下文中使用您的类,那么您通常需要一个锁。

如果您正在从辅助线程加载 UIImage 或以其他方式与 UIKit 对象交互——那不是很好。

关于ios - NSDictionary 泄漏内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9157873/

相关文章:

ios - 为什么 NSDictionary 在使用 DictionaryWithObjectsAndKeys 时有时会删除引号?

ios - 如何将独特的推送通知存储到 sqlite 数据库

ios - 使用 ios-charts 库对条形图中的列进行分组,其中数据条目的数量可变

ios - 存折不保存优惠券

ios - 如果我以编程方式完成所有布局,是否需要启用 Base Internationalization?

ios - 快速关闭和内存泄漏

ios - 核心数据。 NSDictionary VS NSFetchRequest?

java - LinkedList 超出内存限制

iphone - 将字符串提供给对象时泄漏字符串

ios - 在解析 JSON 时使用 NSDictionary 有什么优势或好处?