0

我有一个UIView包含一个UITableView. 此表由NSMutableArray.

initWithFrame:我在 UIView 的方法中初始化了数组和表。

- (id)initWithFrame:(CGRect)frame
{
  self = [super initWithFrame:frame];
  if (self)
  {
    bookTable = [[UITableView alloc]initWithFrame:CGRectMake(100, 108, 260, 535)];
    bookArray = [[NSMutableArray alloc]init]; //this array will be populated later

    //other codes
  }
  return self;
}

我将它们发布在dealloc

- (void)dealloc
{
   [bookTable release];      
   [bookArray release];

   [super dealloc];
}

问题是当应用程序在dealloc. 它产生错误:[CALayer release]: message sent to deallocated instance 0x82db660

我在我的代码中到处查看,我确信我没有过度发布任何东西。我决定删除[bookArray release]in dealloc,它停止崩溃。我跑了Analyze,它没有给我任何潜在的泄漏。

谁能向我解释为什么在 dealloc 中释放数组会导致崩溃?

注意: 表和数组都是视图的实例变量。

编辑: 填充数组的代码:

NSString *sql = [NSString stringWithFormat:@"SELECT BookName FROM books WHERE UserID=%d", userId];
booksArray = [sqlite executeQuery:sql];

请注意,我使用的是 sql 包装器。

4

4 回答 4

0
  1. 更改executeQuery方法的返回语句,例如[array autorelease]
  2. 替换booksArray = [sqlite executeQuery:sql];booksArray = [[sqlite executeQuery:sql] retain];

如果您写propertybooksArray类似的东西,@property(nonatomic, retain) NSMutableArray *bookArray;那么您可以将步骤 2替换为self.bookArray = [sqlite executeQuery:sql];

您的问题是您正在从该executeQuery方法返回一个已发布的对象(您在评论中提到了它)。这就是你收到错误的原因

于 2012-10-22T08:41:08.413 回答
0

我想问题只在这里。

booksArray = [sqlite executeQuery:sql];

executeQuery方法可能返回一个自动释放的 NSMutableArray 或者类似的东西可能写在里面executeQuery

NSMutableArray* tempArray = [NSMutableArray arrayWithCapacity:0];

如果是这样,它应该已经处于自动释放模式,因此没有release方法dealloc

更新

此外,为数组分配 0sign 属性。

@property (nonatomic, retain) NSMutableArray* booksArray;

然后,无论您在哪里使用它,都将其用作self.booksArray

self.booksArray = [sqlite executeQuery:sql];

这样,将是适当的内存管理,然后在 dealloc 中释放数组。

于 2012-10-22T07:33:45.113 回答
0

这就是问题所在

booksArray = [sqlite executeQuery:sql];

返回的数组sqlite是一个自动释放的对象。您必须保留它或从“dealloc”中删除释放。

booksArray = [[sqlite executeQuery:sql] retain];

由于它是自动释放的对象,当系统也尝试释放它时,在 dealloc 中释放它会导致崩溃release

并删除init方法中的数组初始化,这是多余的。

于 2012-10-22T07:33:48.990 回答
0

我建议像这样为 booksArray 创建一个属性:

@property (nonatomic, retain) NSMutableArray *bookArray;

当您填充它时,请尝试以下代码:

self.bookArray = [NSMutableArray arrayWithArray:[sqlite executeQuery:sql]];

这将创建返回数组的自动释放副本,然后由属性“自动”保留。

当然,您应该确保 [sqlite executeQuery:sql] 返回的数组是自动释放的。

于 2012-10-22T08:57:15.477 回答