NSMutableArray не сохраняет значения - PullRequest
0 голосов
/ 06 августа 2011

Я создаю класс с именем DataClass, у меня есть этот метод

+(NSMutableArray*) returnList :(NSString *) sql
{

    NSMutableArray *tmpList=[[[NSMutableArray alloc]init]autorelease];

    sqlite3 *db;

    NSString *dbPath =[[NSBundle mainBundle] pathForResource:@"DB_MyReef" ofType:@"sqlite"];


    if (sqlite3_open([dbPath UTF8String],&db) ==SQLITE_OK)
    {

        sqlite3_stmt *ss;

        int rv = sqlite3_prepare_v2(db, [sql UTF8String], -1,&ss,NULL);

        if (rv==SQLITE_OK)
        {

            while (sqlite3_step(ss)==SQLITE_ROW) 
            {

                NSString *txt =[NSString stringWithUTF8String:(char *)sqlite3_column_text(ss,0)]; 
                [tmpList addObject:txt];
                [txt release];

            }
        }

        sqlite3_finalize(ss);
    }

    sqlite3_close(db);


    return tmpList; 


}

В моем другом классе с именем UserSelect я создаю.

в файле h

@interface UserSelect : UIViewController <UIPickerViewDelegate,UIPickerViewDataSource> {

    NSMutableArray *List;
    UIPickerView *myPicker; 

}

@property (nonatomic,retain) NSMutableArray *List;
@property (nonatomic,retain) UIPickerView *myPicker;


@end

и m file

- (void)viewDidLoad {



    [super viewDidLoad];

    //List=[[NSMutableArray alloc] init;

    NSString *sql;
        //Loading Data
        if ([self.title isEqualToString:@"Marca Teste"]) 
        {
            sql=@"SELECT TESTMARK FROM TBL_TESTSMARK ORDER BY TESTMARK";
        }
        else
        {
            sql=@"SELECT PT_PARAMNAME FROM TBL_PARAMETERS "
            "WHERE COD IN "
            "(SELECT A.CODTEST FROM TBL_TEST AS A  "
            "INNER JOIN  "
            "TBL_TESTSMARK AS B "
            "ON  "
            "A.CODTESTMARK =B.COD "
            "WHERE " 
            "B.TESTMARK='Salifert')";
        }

    self.List=[[NSMutableArray alloc] init];
    self.List=[[NSMutableArray arrayWithArray:[DataClass returnList:sql]]retain];

    myPicker=[[UIPickerView alloc] init];
    myPicker.delegate=self;
    myPicker.dataSource=self;

        /*for (NSString *ts in List) {
            NSLog(@"%@",ts);
        }*/

        [self.view addSubview:myPicker];    


    }

Хорошо, я вызываю этот метод, и это возвращение является ожидаемым.

Но в методах UiPickerView моя переменная List сохраняет только первый объект в массиве NSMutable.

Это методы UIPicker

#pragma mark pickerView

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    NSLog(@"%@",@"numberOfComponentsInPickerView");
    return 1;
}

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    NSLog(@"%@",@"numberOfRowsInComponent");

    return [List count];
}


-(NSString *)pickerView:(UIPickerView *) pickerView titleForRow:(NSInteger) row forComponent:(NSInteger) component
{
    NSString *txt=[[NSString alloc] initWithFormat:@"%@",[self.List objectAtIndex:(int)row]];
    return txt;
    [txt release];
}

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    NSString *txt=[[NSString alloc] initWithFormat:@"%@",[self.List objectAtIndex:(int)row]];

    [DataClass writePlist:txt toKey:TEST_MARK]; 

    [txt release];


}

Я пытался загрузить List разными способами, что не так?

1 Ответ

1 голос
/ 06 августа 2011

Взгляните сюда:

NSString *txt =[NSString stringWithUTF8String:(char *)sqlite3_column_text(ss,0)]; 
[tmpList addObject:txt];
[txt release];

Строка txt автоматически освобождена (NSString stringXXX функции возвращают автоматически выпущенную строку). Затем вы добавляете его в tmpList и явно освобождаете его. Как только пул автозапуска будет слит, строка будет освобождена. Другими словами, вы перепроизводите строку. Удалить

[txt release];

и значения должны быть сохранены на tmpList. Поскольку tmpList также автоматически выпускается, он не уверен, имеет ли это значение. Это может привести к ошибке во время выполнения.

Это также подозрительно:

self.List=[[NSMutableArray alloc] init];
self.List=[[NSMutableArray arrayWithArray:[DataClass returnList:sql]]retain];

Первый alloc-init совершенно не нужен. Если свойство было синтезировано правильно, оно не приведет к утечке, но это не имеет никакого смысла. Удалите первую из этих двух строк.

Кроме того, ваш метод returnList: возвращает строку, но вы используете ее как массив во второй строке, которую я цитировал выше.

В общем, в вашем коде немало логических ошибок. Возможно, вы захотите запустить его через отладчик и анализатор (меню Product - Analyze).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...