我对iOS编程比较陌生,但在其他语言(主要是C#和Java)中有越来越多的编程经验。
我试图为iPad设备创建一些具有指定类别的图片库。
用户界面非常简单,可以从“选择屏幕”(FirstViewController,见下文)和“图库”中进行。选择屏幕包含2个UITableViews,master
和detail
,分别显示产品类别和子类别。当用户进行选择时,它会点击“查看图片”button
,图片将显示在“图库”的滚动视图中。 “Gallery”是一个单独的XIB文件,以模态方式呈现。一切正常。
但是,当用户在“图库”和“选择屏幕”之间来回切换时,会发生奇怪的事情。而奇怪的是,它恰好发生在他们之间的第四次“切换”。 我不断收到消息:
- [FirstViewController tableView:didSelectRowAtIndexPath:]:发送到解除分配的实例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];
}
}
提前致谢!
答案 0 :(得分:1)
过了一会儿,我发现了导致问题的原因......
关键是,在这个特定的应用程序中,“Gallery”被称为模态。
Apple建议在使用模态视图时,调用者(处理显示的主视图)也必须关注同一视图。
在此方案中使用的最佳方法是使用描述delegate
的“自定义”协议以及viewWillBeDismissed
方法。
在我的代码中看起来像这样:
@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;
保留代表参考资料的目的是解决问题......
干杯!