滚动UITableView时,iPhone应用程序退出

时间:2010-01-30 21:08:47

标签: iphone uitableview nsmutablearray

我已经声明了一个NSMutableArray,并用数据库中的信息填充它。该表很好地显示了信息。但是当我向下滚动时,应用程序退出。好像它失去了指向数组的指针。

以下是数组声明的代码:

@interface RootViewController : UITableViewController <CLLocationManagerDelegate> {
 sqlite3 *database;

 NSMutableArray *storeList;
 CLLocationManager *locationManager;
 CLLocation *startingPoint;

}

@property (nonatomic, retain) NSMutableArray *storeList;
@property (nonatomic, retain) CLLocationManager *locationManager;
@property (nonatomic, retain) CLLocation *startingPoint;    

- (void) createCopyOfDatabaseIfNeeded;
- (void) initializeStoreList;
- (void) getDistanceFromUserLocation;

这里我使用StoreInfo类型的对象初始化数组:

- (void) initializeStoreList{
 self.storeList = [[NSMutableArray alloc] init];

 //database is stored in the application bundle.
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 NSString *documentsDirectory = [paths objectAtIndex:0];
 NSString *dbPath = [documentsDirectory stringByAppendingPathComponent:kFileName];

 if (sqlite3_open([dbPath UTF8String], &database)== SQLITE_OK) {
  const char *sql = "select id, storename, ratings, lattitude, longitude from storeinformation";
  sqlite3_stmt *statement;

  if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) {
   while (sqlite3_step(statement) == SQLITE_ROW) {
    NSInteger *_pk = (NSInteger *) sqlite3_column_int(statement, 0);
    NSString *_storeName =  [NSString stringWithUTF8String:(char*) sqlite3_column_text(statement, 1)];
    NSString *_ratings = [NSString stringWithUTF8String:(char*) sqlite3_column_text(statement, 2)];
    double _lattitude = [[NSString stringWithUTF8String:(char*) sqlite3_column_text(statement, 3)] doubleValue];
    double _longitude = [[NSString stringWithUTF8String:(char*) sqlite3_column_text(statement, 4)] doubleValue];

    StoreInfo *si = [[StoreInfo alloc] initWithBasicInformation:_pk storeName:_storeName ratings:_ratings lattitude:_lattitude longitude:_longitude];
    [self.storeList addObject:si];
    [si release];

   }
  }

  sqlite3_finalize(statement);
 } else {
  sqlite3_close(database);
  NSAssert1(0,@"Failed to open the database with message '%s'.", sqlite3_errmsg(database));
 }

}

这是StoreInfo对象的构造函数

-(id)initWithBasicInformation:(NSInteger *)_pk storeName:(NSString *) _storeName ratings:(NSString *) _ratings lattitude:(double) _lattitude longitude:(double) _longitude;
{
     if (self = [super init]) {
  self.primaryKey = _pk;
  self.storeName = _storeName;
  self.ratings = _ratings;
  self.lattitude = _lattitude;
  self.longitude = _longitude;
 }
 return self;
}

以下是显示单元格的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

 // Configure the cell.
 StoreInfo *si = (StoreInfo *)[self.storeList objectAtIndex:indexPath.row];
 cell.textLabel.text = si.storeName;
    return cell;
}

表首先显示正常。但是当我向下滚动时,这甚至会被触发,并且无论如何它都无法找到对si.storeName的引用。

我花了好几个小时试图调试这个问题。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

首先,您如何为有问题的字段定义属性? 是retain吗?

其次,您可以访问si中的任何其他媒体资源吗?

最后,我发现self.storeList = [[NSMutableArray alloc] init];中存在内存泄漏 - 对象被保留两次(在init和属性设置器中)......