我的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中还是在循环后释放它?
关于,
拉特格
答案 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)
。