Iphone 类变量类型已更改

Iphone 类变量类型已更改,iphone,uiviewcontroller,nsobject,Iphone,Uiviewcontroller,Nsobject,因此,在我的视图控制器中,我运行代码来填充Customer(自定义类)对象的NSArray。此自定义类具有另一个名为Address的自定义类的对象(客户具有帐单地址和发货地址)。在视图控制器中,当选择列表中的客户时,它会将客户对象传递给新的视图控制器,如下所示: - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { InfoViewController *

因此,在我的视图控制器中,我运行代码来填充Customer(自定义类)对象的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中的mouseover调试功能,我发现客户shipAddress变量的第一个对象的类型已从NSString更改为NSIndexPath。这不会发生在客户的billAddress对象上。有人知道这是怎么回事吗?看起来我可能有内存管理问题,但我肯定希望在我撕开代码跟踪所有保留和发布之前得到确认

编辑:更多信息在这里。在下面的代码中,我在类级别有一个NSMutableArray。在循环的每次迭代中,我都在XML中的节点之间循环(这很好)。每次检测到一个新字母作为名称的第一个字母时,我都会创建一个新的子数组并将客户添加到其中,从而用检测到的字母表中每个字母的客户子数组填充我的类级别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静态分析器可能会对您有所帮助

我编辑了这个,但我不知道它是否显示为一个更新…您使用了很多带有保留的alloc,这通常不是一个好的做法,您正在以这种方式将引用计数增加2。子阵列(可能)存在潜在问题。叮当声不喜欢什么?代码中有什么不起作用?何时调用此代码?NSURLConnection(接收数据)成功时调用此代码。我的两个类在初始化后都返回[self autorelease]。我认为这是一个很好的做法。我已经删除了alloc+retain行中的保留,现在我比以前更快地得到无效对象。在我的客户类中,有两个地址变量(另一个自定义类)。这两种性质都设置为非原子、保留和合成。Address类还返回[self autorelease]。地址初始化的代码现在发布在上面。我想这就是正在发生的事情(不确定),在某个地方你一定是过度发布了sectionTitles或customers,当你删除retain时崩溃得更快的原因是因为引用计数的增加越少,过度发布就越快发生。再一次,我不能确定,因为我没有完整的图片可以看,但是如果我不得不猜测的话,那就是了
...
else if ([tempname isEqualToString:@"BillAddress"])
  billAddress = [billAddress initWithAddressNode:tempnode];
else if ([tempname isEqualToString:@"ShipAddress"])
  shipAddress = [shipAddress initWithAddressNode:tempnode];
...