iPad:UITableView问题

iPad:UITableView问题,ipad,uitableview,crash,Ipad,Uitableview,Crash,我对iOS编程比较陌生,但在其他语言(主要是C#和Java)中有着丰富的编程经验 我正在尝试为iPad设备的某些产品制作一个类似于图片库的特定类别。 UI非常简单,由“选择屏幕”(FirstViewController,见下文)和“多媒体资料”组成。选择屏幕包含两个UITable视图,master和detail,分别显示产品类别和子类别。当用户进行选择时,点击“查看图片”按钮,图片显示在“多媒体资料”的滚动视图中。“图库”是一个单独的XIB文件,以模式呈现。一切正常 但是,当用户在“多媒体资料”

我对iOS编程比较陌生,但在其他语言(主要是C#和Java)中有着丰富的编程经验

我正在尝试为iPad设备的某些产品制作一个类似于图片库的特定类别。 UI非常简单,由“选择屏幕”(FirstViewController,见下文)和“多媒体资料”组成。选择屏幕包含两个UITable视图,
master
detail
,分别显示产品类别和子类别。当用户进行选择时,点击“查看图片”
按钮
,图片显示在“多媒体资料”的滚动视图中。“图库”是一个单独的XIB文件,以模式呈现。一切正常

但是,当用户在“多媒体资料”和“选择屏幕”之间来回切换时,会发生奇怪的事情。奇怪的是,它正好发生在第四节,在它们之间“切换”。 我一直得到这样的信息:

-[FirstViewController tableView:DidSelectRowatinIndexPath:]:发送到解除分配实例0x4b1f9f0的消息“

然后程序崩溃了。。。 我已经设置了NSAutoreleaseFreedObjectCheckEnabled、NSZombiesEnabled和NSDebugEnabled,但仍然没有更详细的描述。即使是“Guard malloc”也没有帮助

我理解这是一些记忆问题,但不知道为什么?完美地工作了3次,但不是第4次

下面是导致故障的代码部分:


-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    //check which table (master or detail) row is clcked then perform click event
    if( tableView.tag == 0){
        //populate list of brands using predefined function
        [self populateBrandNames:(int)indexPath.row];

        //reload data
        [detail reloadData];

        //4 a good UI experience we'll remove any previous picture loaded into brandImage
        bUserSelected = false;
        [brandImage setBackgroundImage:nil forState:UIControlStateNormal];
    }else{    //the detail table sent event
        NSIndexPath *master_row, *details_row;

        //get selected rows
        master_row = [master indexPathForSelectedRow];
        details_row = [detail indexPathForSelectedRow];

        NSString *logoName = [[NSString alloc] initWithFormat:@"%02d%02d_logo", (int)master_row.row, (int)details_row.row];
        NSString *path = [[NSBundle mainBundle] pathForResource:logoName ofType:@"jpg"];

        //check if we have path to resource (if logo exsist)
        if( path != nil ){
            UIImage *logo = [[UIImage alloc] initWithContentsOfFile:path];

            //display selected logo
            bUserSelected = true;
            [brandImage setBackgroundImage:logo forState:UIControlStateNormal];
            NSLog(@"brandImame set");

            //set current galery tag
            [currentGaleryTag setString:@""];
            [currentGaleryTag appendFormat:@"%02d%02d", (int)master_row.row, (int)details_row.row];
            [logo release];
        }else{
            NSLog(@"logo not loaded, galery tag : %@, category name : %@", logoName, [detail cellForRowAtIndexPath:details_row].textLabel.text );
        }

        [logoName release];
    }
}

提前谢谢!

过了一会儿,我发现问题出在哪里了

关键是,在这个特定的应用程序中,“画廊”被称为modally。 苹果公司建议,在使用模式视图时,调用者(处理显示的主视图)也必须注意忽略相同的视图。 在此场景中使用的最佳方法是使用“自定义”协议,该协议描述了一个
委托
和类似
视图的方法

在我的代码中,一个看起来像这样:

@protocol ModalViewControllerDelegate 

- (void)didDismissModalView;

@end

@interface Galery : UIViewController {
    //outlets declaration
    ...

    //some other declarations here...

    //delegate reference
    id delegate;
}

//outlets and views properties
@property (nonatomic, assign) id delegate;

@end

引起故障的是这条线路:

@property (nonatomic, assign) id delegate;
唯一需要改变的是这个

@property (nonatomic, retain) id delegate;
保留代理引用是解决问题的方法

干杯