0

私はUIViewを保持するを持っていますUITableView。このテーブルには、が入力されていNSMutableArrayます。

UIViewのinitWithFrame:メソッドで配列とテーブルの両方を初期化しました。

- (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]dealloc、クラッシュしなくなりました。を実行しましたが、Analyzeリークの可能性はありません。

誰かがdeallocで配列を解放するとクラッシュが発生する理由を私に説明できますか?

注: テーブルと配列はどちらもビューのインスタンス変数です。

編集: 配列にデータを入力するためのコード:

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

SQLラッパーを使用していることに注意してください。

4

4 に答える 4

0

次のように booksArray のプロパティを作成することをお勧めします。

@property (nonatomic, retain) NSMutableArray *bookArray;

入力するときは、次のコードを試してください。

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

これにより、返された配列の自動解放されたコピーが作成され、プロパティによって「自動」保持されます。

もちろん、[sqlite executeQuery:sql] によって返される配列が自動解放されていることを確認する必要があります。

于 2012-10-22T08:57:15.477 に答える
0
  1. executeQueryメソッドの return ステートメントを次のように変更します[array autorelease]
  2. booksArray = [sqlite executeQuery:sql];で置き換えますbooksArray = [[sqlite executeQuery:sql] retain];

同様に書いた場合は、ステップ2を次propertybooksArrayよう@property(nonatomic, retain) NSMutableArray *bookArray;に置き換えることができます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];

このような場合、すでに自動解放モードになっているはずなのでreleasedeallocメソッドはありません。

アップデート

また、配列に as0sign プロパティ。

@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 に答える