【发布时间】:2011-01-08 12:18:22
【问题描述】:
我在 iPhone SDK 3.1 上的以下代码段中难以理解内存管理。
// Create array to hold each PersonClass object created below
NSMutableArray *arrayToReturn = [[[NSMutableArray alloc] init] autorelease];
NSArray *arrayOfDictionaries = [self generateDictionaryOfPeople];
[arrayOfDictionaries retain];
for (NSDictionary *dictionary in arrayOfDictionaries) {
PersonClass *aPerson = [[PersonClass alloc] init];
for (NSString *key in [dictionary keyEnumerator]) {
if ([key isEqualToString:[[NSString alloc] initWithString: @"FIRST_NAME"]])
aPerson.firstName = [dictionary objectForKey:key];
else if ([key isEqualToString:[[NSString alloc] initWithString: @"LAST_NAME"]])
aPerson.lastName = [dictionary objectForKey:key];
}
// Add the PersonClass object to the arrayToReturn array
[arrayToReturn addObject: aPerson];
// Release the PersonClass object
[aPerson release];
}
return arrayToReturn;
[self generateDictionaryOfPeople] 方法返回一个 NSDictionary 对象数组。每个 NSDictionary 对象都有两个键“FIRST_NAME”和“LAST_NAME”,其中一个人的名字和姓氏作为各自的数据。代码循环遍历 arrayOfDictionaries 数组中的每个字典对象,并将字典数据分配给 aPerson (PersonClass) 对象的相关属性。然后将该对象添加到从该方法返回的数组中。
在运行仪器时,我发现 arrayOfDictionaries 数组中包含的字典对象泄漏。 [self generateDictionaryOfPeople] 方法中的代码在每个 NSDictionary 对象被创建并添加到数组时调用[dictionaryObject release],这使得对象 1 的保留计数(因为将对象添加到数组将使保留计数 2 ,但随后我的发布消息将其减回到 1)。
我假设这个泄漏是因为我从不释放 arrayOfDictionaries 数组,因此数组中的 NSDictionary 对象永远不会被释放。如果我尝试在上述代码段的末尾释放数组,则会收到“发送到已释放实例的消息”错误。我理解为什么会发生这种情况,因为我在一个字典项(我随后发布)中分配了 aPerson 对象数据,但我不知道在哪里可以释放 arrayOfDictionaries 数组。任何帮助将不胜感激。
谢谢!
编辑:下面是[self generateDictionaryOfPeople]的实现
- (NSArray *)generateDictionaryOfPeople {
NSMutableArray *arrayFromDatabase = [[[NSMutableArray alloc] init] autorelease];
// ** Query the database for data **
while ( there are rows being returned from the database ) {
// Declare an NSMutableDictionary object
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
// Loop through each column for that row
for ( while there are columns for this row ) {
columnTitle = title_of_column_from_database
columnData = data_in_that_column_from_database
// Add to the dictionary object
[dictionary setObject:columnData forKey:columnTitle];
// Release objects
[columnName release];
[columnTitle release];
}
// Add the NSMutableDictionary object to the array
[arrayFromDatabase addObject:dictionary];
// Release objects
[dictionary release];
}
// Return the array
return arrayFromDatabase;
}
【问题讨论】:
-
请看在 OOP 的份上,创建一个 Person 类,而不是用字典来搞乱。即使我们只是一个字典的包装器。
-
@Mike:不幸的是我不能这样做,因为该类实际上从数据库中获取其他对象的数据,而不仅仅是 Person 对象的数据。上面的代码是代码的简化示例(因为我不想通过将所有数据库查询代码也放入其中来混淆情况)。
标签: iphone objective-c cocoa memory-management memory-leaks