Objective-C消息被发送到地址为0xaa722d0的解除分配对象(僵尸)

时间:2012-01-09 03:46:59

标签: iphone objective-c ios

更新: - [NSIndexPath行]:发送到解除分配的实例0x895fe70的消息

当我在设备上运行我的应用程序并分析它时说:

  

将Objective-C消息发送到地址为0xaa722d0的解除分配对象(僵尸)。

它显示错误:

- (void)tableView:(UITableView *)tableView 
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    int newRow = [indexPath row];
    int oldRow = (lastIndexPath != nil) ? [lastIndexPath row]: -1;

我是Objective C编程的新手,并且两天以来一直在努力解决以下问题,我最近使用Xcode 3.2.6创建了一个应用程序,但是两天前升级到Xcode 4,现在我面临内存释放问题码。我研究过使用乐器和启用僵尸,并了解问题发生的地方,但是无法解决问题, 我请求一些指导..下面是我的代码在Xcode 4.2中运行。

#pragma mark -
#pragma mark Table Data Source Methods
- (NSInteger)tableView:(UITableView *)tableView 
 numberOfRowsInSection:(NSInteger)section {
    return [list count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CheckMarkCellIdentifier = @"CheckMarkCellIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
                             CheckMarkCellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                       reuseIdentifier:CheckMarkCellIdentifier] autorelease];
    }
    NSUInteger row = [indexPath row];
    NSUInteger oldRow = [lastIndexPath row];
    cell.textLabel.text = [list objectAtIndex:row];
    cell.accessoryType = (row == oldRow && lastIndexPath != nil) ? 
    UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;

    return cell;
}

#pragma mark -
#pragma mark Table Delegate Methods
- (void)tableView:(UITableView *)tableView 
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    int newRow = [indexPath row];
    int oldRow = (lastIndexPath != nil) ? [lastIndexPath row]: -1;

    //----Captures the value selected in the list and shown in parent view.
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    SchneiderBMSAppDelegate *appDelegate = (SchneiderBMSAppDelegate *)[[UIApplication sharedApplication] delegate];
    appDelegate.priorityValue = cell.textLabel.text;

    NSLog(@"Product selected is: %@",appDelegate.priorityValue);

    if (newRow != oldRow)
    {
        UITableViewCell *newCell = [tableView cellForRowAtIndexPath:
                                    indexPath];
        newCell.accessoryType = UITableViewCellAccessoryCheckmark;

        UITableViewCell *oldCell = [tableView cellForRowAtIndexPath: 
                                    lastIndexPath]; 
        oldCell.accessoryType = UITableViewCellAccessoryNone;
        lastIndexPath = indexPath;

    }

    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

- (void)viewDidUnload {
    self.list = nil;
    self.lastIndexPath = nil;
    [super viewDidUnload];
}
- (void)dealloc {
   [list release];
    [lastIndexPath release];
    [super dealloc];
}

2 个答案:

答案 0 :(得分:3)

你似乎在假设当lastIndexPath被释放时,它将变为零。事实并非如此。您需要保留对象(最好使用setter而不是直接设置实例变量)或不存储对它的引用。

答案 1 :(得分:0)

我有一个应用程序使用了几乎相同的代码(不记得我引用了哪个教程)我在iOS 4.3中完成但没有发布到App Store。当我最近恢复应用程序并尝试在iOS 5中运行它时,我遇到了完全相同的问题。我可以通过更改行来使其工作:

lastIndexPath = indexPath;

self.lastIndexPath = indexPath;

然后它在iOS 5中运行良好。我猜它通过保留对象来完成与Chuck建议相同的事情。但为什么iOS 5关注而不是iOS 4.3 ???可能是因为iOS 5中的ARC?