NSDictionary泄露内存

时间:2012-02-06 09:18:22

标签: 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];
        }
    }
}

1 个答案:

答案 0 :(得分:2)

下面:

shotPageURL = [shotDribbblePage retain];

你应该使用访问者:

self.shotPageURL = shotDribbblePage;

我应该真的强调你应该在任何地方使用你的访问者,因为他们为你做了引用计数(例外:不在初始化器和dealloc中)。正如铍还指出的那样,如果没有存取器,你可以手动进行引导计数。这需要基本形式:

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

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

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

如果您正在加载UIImage或以其他方式与辅助线程中的UIKit对象进行交互 - 那就不好了。