2011-01-12 65 views
1

我有我的viewDidLoad中下面几行:什么时候从viewDidLoad中的循环释放NSMutableArray?

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阵列。它也在我的头文件中正确声明,并且(当然)合成。

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

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

与问候,

拉特格

回答

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)替换for(NSString *key in [self.sections allKeys])

1

决不通的alloc-init'd对象直接插入NSDictionary

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

传递而不是自动释放空数组:

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

该栏目字典ionary是要保留它,这样你就可以释放它在那里,如:

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