因此,在我的视图控制器中,我运行代码来填充客户(自定义类)对象的NSArray。此自定义类具有名为Address的另一个自定义类的对象(客户具有帐单地址和送货地址)。在视图控制器中,当选择列表中的客户时,它会将新的视图控制器传递给客户对象,如下所示:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
InfoViewController *customerinfoViewController = [[InfoViewController alloc] initWithStyle:UITableViewStyleGrouped andCustomer:[[[customers objectAtIndex:indexPath.section] objectAtIndex:indexPath.row] retain]];
[self.navigationController pushViewController:customerinfoViewController animated:YES];
[customerinfoViewController release];
}
我第一次在运行应用程序时访问此视图控制器,它工作正常。但是,当我重新访问视图控制器时,会发生一些有趣的事情。应用程序崩溃,无法识别的选择器发送到实例0x00whatever。使用xCode中的鼠标悬停调试功能,我发现客户的shipAddress变量的第一个对象的类型从NSString更改为NSIndexPath。这不会发生在客户的billAddress对象上。任何人都知道这里发生了什么?看起来我可能遇到了内存管理问题,但我确实想要对此进行确认,然后再拆除所有保留和释放的代码......
编辑:这里有更多信息。使用以下代码,我在类级别有一个NSMutableArray。在循环的每次迭代中,我循环遍历XML中的节点(工作正常)。每次检测到新字母作为名称的第一个字母时,我创建一个新的子阵列并将客户添加到其中,从而为检测到的每个字母表中的客户subArrays填充我的班级NSMutableArray(客户)。我的问题是关于自行车客户对象的保留和释放。 Clang Static说客户有一个过度保留的错误,但是当我根据Clang修复它时,循环崩溃了。是什么赋予了?相关代码如下:
DDXMLDocument *rootDoc = [[[DDXMLDocument alloc] initWithData:xmlData options:0 error:nil] autorelease];
NSArray *elems = [rootDoc nodesForXPath:@"QBXML/QBXMLMsgsRs/CustomerQueryRs/CustomerRet" error:nil];
DDXMLNode *node;
sectionTitles = [[[NSMutableArray alloc] initWithCapacity:1] retain]; // Letters for UITableView section titles
NSMutableArray *subArray;
NSString *lastchar = @"A";
NSString *testchar;
int indexCount = -1;
customers = [[[NSMutableArray alloc] initWithCapacity:[elems count]] retain];
Customer *newCust;
for (int i = 0; i < [elems count]; i++) {
node = [elems objectAtIndex:i];
newCust = [[Customer alloc] initWithCustomerRetNode:node];
testchar = [[newCust fullName] substringToIndex:1];
if (i == 0 || ![[testchar uppercaseString] isEqualToString:lastchar]) {
[sectionTitles addObject:testchar];
lastchar = testchar;
indexCount++;
subArray = [[NSMutableArray alloc] initWithCapacity:1];
[customers addObject:subArray];
[subArray release];
[[customers lastObject] addObject:[newCust retain]];
}
else {
[[customers lastObject] addObject:[newCust retain]];
}
[newCust release];
}
注意:此代码大部分都有效,但clang不喜欢它。
编辑:Customer类中的地址是这样分配的(现在在Clang修复后不起作用)
...
else if ([tempname isEqualToString:@"BillAddress"])
billAddress = [billAddress initWithAddressNode:tempnode];
else if ([tempname isEqualToString:@"ShipAddress"])
shipAddress = [shipAddress initWithAddressNode:tempnode];
...
答案 0 :(得分:1)
听起来你有一个过度发布的问题,所以是内存管理,你可能会过度释放你正在存储你的对象的数组。但是,我们可以从代码片段中说出来。你必须去查看代码并找到源代码。使用Clang Static Analyzer也可能对您有所帮助。