何时从viewDidLoad中的循环释放NSMutableArray?

时间:2011-01-12 20:27:39

标签: objective-c memory-leaks nsmutablearray

我的viewDidLoad中有以下几行:

self.sections = [[NSMutableDictionary alloc] init];

BOOL found;

// Loop through the signs and create our keys
for (NSDictionary *sign in self.allSigns)
{        
    NSString *c = [[sign objectForKey:@"name"] substringToIndex:1];

    found = NO;

    for (NSString *str in [self.sections allKeys])
    {
        if ([str isEqualToString:c])
        {
            found = YES;
        }
    }

    // If string is not found, add it in uppercase to the sections array.
    if (!found)
    {   ** Potential leak of an object.**  
        [self.sections setValue:[[NSMutableArray alloc] init] forKey:[c uppercaseString]]; 
    }
    [sign release];
}

// Loop again and sort the signs into their respective keys
for (NSDictionary *sign in self.allSigns)
{
    NSString *dummy = [[sign objectForKey:@"name"] substringToIndex:1];
    [[self.sections objectForKey:[dummy uppercaseString]] addObject:sign];
}    

// Sort each section array
for (NSString *key in [self.sections allKeys])
{
    [[self.sections objectForKey:key] sortUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]]];
}    


//self.numberOfEntries = [[allSigns allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 
[dataLoader release];
[super viewDidLoad];

之后我在各种tableview委托方法中使用self.sections数组。它也在我的标题中正确声明,并且(当然)合成。

但是当我运行Build&分析,Xcode告诉我有一个物体可能泄漏。但我不知道我应该在哪里发布这个NSMutableArray,因为我不知道,例如,对象的名称。

我应该把它放在我的dealloc中还是在循环后释放它?

关于,

拉​​特格

3 个答案:

答案 0 :(得分:1)

从不直接将alloc-init'd对象传递到NSDictionary

[self.sections setValue:[[NSMutableArray alloc] init] forKey:[c uppercaseString]];

传递一个自动释放的空数组:

[self.sections setValue:[NSMutableArray array] forKey:[c uppercaseString]];

答案 1 :(得分:1)

部分字典将保留它,因此你可以在那里发布它,例如:

NSMutableArray* newArray = [[NSMutableArray alloc] init];
[self.sections setValue:[newArray forKey:[c uppercaseString]]; 
[newArray release];

答案 2 :(得分:0)

BoltClock和zpasternack为您的问题提供了两个正确的答案,但我有一些提示可以改进代码的其他方面。

如果字典不包含键,则objectForKey将返回nil。您可以使用它来加快检查密钥的速度。

found = ([self.sections objectForKey:c] != nil);

您还可以将对象添加到第一个循环中并删除第二个循环。

if(!found) {
    //add new mutable array
}
[[self.sections objectForKey:c] addObject:sign];

你有没有理由在第一个循环中释放符号?你没有在这里分配它,你只是从阵列中得到它。

NSDictionary会自动对密钥使用快速枚举,因此您可以将for(NSString *key in [self.sections allKeys])替换为for(NSString *key in self.sections)