【问题标题】:Why my array of NSDictionary lost its objects?为什么我的 NSDictionary 数组丢失了它的对象?
【发布时间】:2014-02-11 01:22:07
【问题描述】:

我遇到了这个问题我已经在我的 NSLog 中获取了该对象,但是当我尝试以另一种方法访问我的 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_alldataInSelectItem 的方式。我在头文件中声明了它

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

【问题讨论】:

  • 你没有告诉我们_l_alldataInSelectItem是如何声明/分配的。
  • @HotLicks 我已经编辑了我的帖子
  • 尝试用self.l_alldataInSelectItem 替换对_l_alldataInSelectItem 的引用。 (然后运行 ​​Product->Analyze 以识别内存管理问题。)
  • 感谢@PhillipMills 现在正在工作。

标签: ios objective-c arrays nsdictionary


【解决方案1】:

系统地了解各种可能性。

可能性 1:某处有小妖精试图惹恼你。我们排除了这一点。

可能性 2:您从未创建过数据。在 selectItemDataTbl 中的 return 语句上设置断点并检查它。

可能性 3:您从未存储过数组。好吧,事实上您将一个空的可变数组存储到 _l_alldataInSelectItem 中,这绝对没有意义,但是在 selectItemData 的最后一条语句上设置一个断点并检查它。

可能性 4:您存储并覆盖了它。搜索您存储到 _l_alldataInSelectItem 或名为 l_alldataInSelectItem 的属性的所有位置,在任何地方设置断点并检查。

可能性5(愚蠢的那个):_l_alldataInSelectItem 是一个弱实例变量或一个弱属性。

可能性 6:您存储了它,但在不同的地方寻找它。 textFieldshouldChange中的self和selectItemData中的self一样吗?设置断点并检查。

可能性 7:您正在异步执行某些操作。该变量将被设置,但比您想象的要晚得多。

最重要的是:牢记做错了什么,你不必解决任何神奇的谜题,你需要做的就是找出你做错了什么.

【讨论】:

  • 您确实看到了Phillip Mills cmets 和 NewDroidDev 对评论的回答?
猜你喜欢
  • 2017-01-07
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多