【问题标题】:object crashes Application对象崩溃应用程序
【发布时间】:2010-02-13 19:54:55
【问题描述】:

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

当我启动我的应用程序时,这会工作几次。选择一行并在一个随机点返回主 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];

 }

使用该代码,我的应用程序在“之前”之后崩溃......“之后”永远不会出现。 我不知道为什么我的“类别”对象会导致我的应用程序崩溃?!

我的类别对象在我的头文件中定义并且有一个@property(非原子,保留)。我合成它并在我的 dealloc 方法中释放它。

有人有想法吗?

// 编辑:

这里有更多细节,因为 cmets:

调试器控制台说:“程序收到信号:“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;
}

【问题讨论】:

  • 您能否提供有关崩溃的更多详细信息?如果您调试应用程序而不仅仅是运行它(cmd-Y 与 cmd-R),您通常会让调试器在崩溃点暂停执行。这样您就可以检查确切的回溯并查看当时任何实例变量的值。
  • 请显示您创建类别数组的代码
  • 我认为您在 ablogSingleCatTableViewController initWithStyle:category: 方法中存在问题。你能发布你的代码吗?
  • 我编辑了我的第一篇文章。看看有没有帮助=(

标签: iphone objective-c cocoa-touch


【解决方案1】:

好的,第一件事是;

[self setCategories:[[NSArray alloc] initWithContentsOfFile:path]];

你这里有泄漏。只需使用

categories = [[NSArray alloc]  initWithContentsOfFile:path];

此处发生崩溃;

currentCategory = cat;

你必须保留、使用;

currentCategory = [cat retain];

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

【讨论】:

  • 在保留我的“猫”后,它现在对我有用。我是objective-c的新手,也是我必须保留和释放对象的语言的新手,所以我总是有点困惑,不知道什么时候做这些事情,特别是保留,释放效果很好:D另一件事,为什么我在“setCategories”中有泄漏?我的意思是,我将类别作为属性,所以我有一个 setter 方法。但再次感谢!它解决了。
  • 您应该从 Apple 的文档开始,请参阅此帖子 stackoverflow.com/questions/106627/… ,您可以在那里找到有用的链接。学习内存管理很重要,从那开始,编码会比你想象的要容易。祝你好运。
  • 在“setCategories”中,您已经使用@property(非原子,保留)增加了类别bty的保留计数。但是你也有[[NSArray alloc] init..],它被保留但永远不会被释放,所以你会有泄漏。你可以写 [self setCategories:[[NSAray alloc] init...] autorelease],这样分配的 nsarray 会自动释放,但是这样使用没有意义。事实上你应该只使用 self.categories = [NSArray arrayWithContentOfFile:path]; ,这将保留类别的数量并设置内容。
【解决方案2】:

如果您要创建这样的数组:

NSArray *tmpArray = [[NSArray alloc] initWithBlah ...];

确保您使用以下代码使用合成的 getter 分配它:

self.categories = tmpArray;
[tmpArray release];

如果你这样做:

categories = tmpArray;
[tmpArray release];

实例变量根本不会被保留。

【讨论】:

  • 我的方式:NSString *path = [[NSBundle mainBundle] pathForResource:@"Categories" ofType:@"plist"];类别 = [[NSArray alloc] initWithContentsOfFile:path];
  • 改成 self.categories 就可以了。就像我在帖子中所做的那样。
  • [self setCategories:[[ NSArray alloc...?
  • 同样的效果。奇怪的是。我打开我的应用程序,我单击此单元格,返回,打开,返回并在随机点上,它崩溃了......但总是当我点击单元格时,并且每次在我尝试读取此数组的位置。但之前的 4-5-6 次(在同一会话中)效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多