我有一个NSArray,它填充了我的UITableViewController的init方法。
我在“didSelectRowAtIndexPath”中使用此对象来推送另一个tableviewcontroller。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
ablogSingleCatTableViewController *singleCatTableViewController = [[ablogSingleCatTableViewController alloc] initWithStyle:UITableViewStylePlain category:[categories objectAtIndex:indexPath.row]];
[[self navigationController] pushViewController:singleCatTableViewController animated:YES];
[singleCatTableViewController release];
}
当我启动我的应用程序时,这可以工作几次。选择一行并在rondom点返回主uitableview控制器后,我的应用程序在选择一行后崩溃。
我发现了一些nslog,如果我尝试使用我的“类别”对象,它会崩溃。
所以
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"before");
NSLog(@"cats: %@", categories);
NSLog(@"after");
ablogSingleCatTableViewController *singleCatTableViewController = [[ablogSingleCatTableViewController alloc] initWithStyle:UITableViewStylePlain category:[categories objectAtIndex:indexPath.row]];
[[self navigationController] pushViewController:singleCatTableViewController animated:YES];
[singleCatTableViewController release];
}
使用该代码我的应用程序在“之前”之后崩溃......“之后”从未出现过。 我不知道为什么我的“类别”对象会崩溃我的应用程序?!
我的categories对象在我的头文件中定义,并且有一个@property(非原子,保留)。我合成它并用我的dealloc方法释放它。
有人有想法吗?
//编辑:
这里有一些细节,因为评论:
调试器控制台说:“程序接收信号:”EXC_BAD_ACCESS“。
我像这样创建类别数组:
- (void)initCategories {
NSString *path = [[NSBundle mainBundle] pathForResource:@"Categories" ofType:@"plist"];
[self setCategories:[[NSArray alloc] initWithContentsOfFile:path]];
}
在我的initwithstyle方法中调用此方法
[self initCategories];
我的其他自定义初始化方法如下所示:
- (id)initWithStyle:(UITableViewStyle)style category:(NSDictionary*)cat {
if (self = [super initWithStyle:style]) {
currentCategory = cat;
items = [[NSMutableArray alloc] init];
self.title = [currentCategory objectForKey:@"TITLE"];
//XLog("%@", currentCategory);
}
return self;
}
答案 0 :(得分:1)
如果要创建类似这样的数组:
NSArray *tmpArray = [[NSArray alloc] initWithBlah ...];
确保使用此代码使用合成的getter分配它:
self.categories = tmpArray;
[tmpArray release];
如果你这样做:
categories = tmpArray;
[tmpArray release];
实体变量根本不会保留。
答案 1 :(得分:1)
好的,首先是;
[self setCategories:[[NSArray alloc] initWithContentsOfFile:path]];
你在这里泄漏了吗?只需使用
categories = [[NSArray alloc] initWithContentsOfFile:path];
此处发生崩溃;
currentCategory = cat;
你必须保留,使用;
currentCategory = [cat retain];
这些是我在发布的代码中看到的问题,如果你在程序的其余部分没有任何错误,那么这些修复应该没问题。