2014-02-11 5 views
0

У меня возникли трудности с этим. У меня есть метод, который возвращает значение массива NSDictionary, когда я передаю возвращаемое значение массива сначала, когда он работает. Я уже получаю объект в своем NSLog, но когда я пытаюсь получить доступ к объектам моего массива NSDictionary в другом методе, я получаю ошибку, и я думаю, что я теряю объекты массива.Почему мой массив NSDictionary потерял свои объекты?

Вот метод, который возвращает массив NSDictionary:

-(NSMutableArray *)selectItemDataTbl { 
    NSMutableArray *l_array_data = [[NSMutableArray alloc] init]; 

    NSString *query = @"SELECT pid, fname, gen_name, type, fu, fprice FROM tbl_selectItem_data"; 
    sqlite3_stmt *l_statement; 

    if (sqlite3_open([l_SqliteDb UTF8String], &(_database)) == SQLITE_OK) { 
     if (sqlite3_prepare_v2(_database, [query UTF8String], -1, &l_statement, nil) == SQLITE_OK) { 
      while(sqlite3_step(l_statement) == SQLITE_ROW){ 
       NSMutableDictionary *l_dataDictionary = [[NSMutableDictionary alloc]init]; 

       NSString *l_pid = [NSString stringWithUTF8String:(char *)sqlite3_column_text(l_statement, 0)]; 
       NSString *l_name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(l_statement, 1)]; 
       NSString *l_genName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(l_statement, 2)]; 
       NSString *l_Type = [NSString stringWithUTF8String:(char *)sqlite3_column_text(l_statement, 3)]; 
       NSString *l_u = [NSString stringWithUTF8String:(char *)sqlite3_column_text(l_statement, 4)]; 
       NSString *l_Price = [NSString stringWithUTF8String:(char *)sqlite3_column_text(l_statement, 5)]; 

       [l_dataDictionary setObject:l_pid forKey:@"pid"]; 
       [l_dataDictionary setObject:l_name forKey:@"name"]; 
       [l_dataDictionary setObject:l_genName forKey:@"genName"]; 
       [l_dataDictionary setObject:l_Type forKey:@"Type"]; 
       [l_dataDictionary setObject:l_u forKey:@"u"]; 
       [l_dataDictionary setObject:l_Price forKey:@"Price"]; 

       [l_array_data addObject:l_dataDictionary]; 
      } 
      NSLog(@"l_array_data count: %i", [l_array_data count]); 

      sqlite3_finalize(l_statement); 
      sqlite3_close(_database); 
     } 
    } 
    return l_array_data; 
} 

А вот мой метод, как я к нему доступ, я звоню на моем viewDidLoad:

- (void)selectItemData { 
    _l_alldataInSelectItem = [[NSMutableArray alloc] init]; 
    _l_prodId = [[NSMutableArray alloc] init]; 
    _l_prodName = [[NSMutableArray alloc] init]; 
    _l_prodGenName = [[NSMutableArray alloc] init]; 
    _l_prodCompType = [[NSMutableArray alloc] init]; 
    _l_prodUom = [[NSMutableArray alloc] init]; 
    _l_prodListPrice = [[NSMutableArray alloc] init]; 
    _l_alldataInSelectItem = [dbc selectItemDataTbl]; 
    _l_selectItemData_Dictionary = [[NSDictionary alloc] init]; 
    for (_l_selectItemData_Dictionary in _l_alldataInSelectItem) { 
     NSString *Id = [_l_selectItemData_Dictionary valueForKey:@"pid"] ; 
     NSString *Name = [_l_selectItemData_Dictionary valueForKey:@"name"]; 
     NSString *GenName = [_l_selectItemData_Dictionary valueForKey:@"genName"]; 
     NSString *Type = [_l_selectItemData_Dictionary valueForKey:@"Type"]; 
     NSString *U = [_l_selectItemData_Dictionary valueForKey:@"u"]; 
     NSString *Price = [_l_selectItemData_Dictionary valueForKey:@"Price"]; 

     [_l_prodId addObject:Id]; 
     [_l_prodName addObject:Name]; 
     [_l_prodGenName addObject:GenName]; 
     [_l_prodCompType addObject:GenName]; 
     [_l_prodUom addObject:U]; 
     [_l_prodListPrice addObject:Price]; 
    } 
    NSLog(@"adsfasdf %@", _l_prodId); 
    NSLog(@"adsfasdf %i", [_l_alldataInSelectItem count]); 
} 

Но в этом методе я не может получить значение моего массива _l_alldataInSelectItem

- (void)textFieldshouldChange { 
    NSString *searchKey = self.txt_SearchField.text; 
    NSMutableArray *searchingData = [[NSMutableArray alloc] init]; 

    if (![searchKey isEqualToString:@""]) { 
     NSLog(@"When TextField text is changed, this will be called"); 
     NSLog(@"textFieldshouldChange _l_alldataInSelectItem: %i", [_l_alldataInSelectItem count]); 
    } 
} 

вот как я заявляю о своем l_alldataIn Выберите предмет. Я объявил это в своем заголовочном файле

@property (strong, nonatomic) NSMutableArray *l_alldataInSelectItem, *l_prodId, *l_prodName, *l_prodGenName, *l_prodCompType, *l_prodUom, *l_prodListPrice; 
+0

Вы не даёте нам подсказки о том, как объявлен/выделен '_l_alldataInSelectItem'. –

+0

@HotLicks Я уже редактировал сообщение – NewDroidDev

+1

Попробуйте заменить ссылки на '_l_alldataInSelectItem' на' self.l_alldataInSelectItem'. (Затем запустите Product-> Analyze, чтобы определить проблемы управления памятью.) –

ответ

0

Идите систематически через возможности.

Возможность 1: Есть где-то гремлины, пытающиеся вас разозлить. Мы исключаем это.

Возможность 2: вы никогда не создавали данные. Установите контрольную точку в операторе return в selectItemDataTbl и проверьте его.

Возможность 3: вы никогда не храните массив. Ну, есть факт, что вы храните пустой изменяемый массив в _l_alldataInSelectItem, который абсолютно бессмысленен, но установите точку останова в последнем утверждении в selectItemData и проверьте его.

Возможность 4: вы сохранили его и перезаписали. Найдите все места, где вы храните _l_alldataInSelectItem, или свойство l_alldataInSelectItem, установите точки останова всюду и проверьте.

Возможность 5 (глупая): _l_alldataInSelectItem - слабая переменная экземпляра или слабое свойство.

Возможность 6: Вы сохранили его, но искали его в другом месте. Является ли self в textFieldshouldChange таким же, как self в selectItemData? Установите контрольные точки и проверьте.

Возможность 7: Вы делаете что-то асинхронно. Переменная будет установлена, но намного позже, чем вы думаете.

Самое важное: Положите это очень сильно в своем уме, что вы сделали что-то не так, и вам не нужно решать какие-либо магические головоломки, все, что вам нужно сделать, это выяснить, что вы сделали неправильно.

+0

Вы видели [Phillip Mills] (http://stackoverflow.com/questions/21691258/why-my-array-of-nsdictionary-lost-its-objects/35827708#comment32794989_21691258) комментарии и ответ NewDroidDev на комментарий? – bummi

Смежные вопросы