对象崩溃应用程序

时间:2010-02-13 19:54:56

标签: iphone objective-c cocoa-touch

我有一个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;
}

2 个答案:

答案 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];

这些是我在发布的代码中看到的问题,如果你在程序的其余部分没有任何错误,那么这些修复应该没问题。