【问题标题】:Programme crashes when add dictionary to array?将字典添加到数组时程序崩溃?
【发布时间】:2012-03-15 04:57:28
【问题描述】:

我在尝试将对象添加到数组时遇到崩溃问题,我认为我创建对象并释放它的方式存在问题。但我不太确定,因为我的内存管理还是有点弱

 NSMutableDictionary *schools = [[NSMutableDictionary alloc] init];
    [schools setObject:name forKey:kFavoriteSchoolName];
    //load data is getting data from NSUserDefault which I save
    NSMutableArray *loadedArray = [self loadData];

//if loadedarray has object in there, then continue adding schools to it or make new array
if([loadedArray count] > 0)
{
    [loadedArray addObject:schools];

    > // it crashes here


    [schools release];

    return loadedArray;
} else
{ 

    //It will add the school to the array for the first time if there is nothing when it loaded.

    NSMutableArray *tempArray = [[[NSMutableArray alloc] init] autorelease];
    [tempArray addObject:schools];

    [schools release];

    return tempArray;
}

此功能有助于将学校添加到收藏列表中。一次添加不了,再添加就崩溃了。

这是我的 loadData 函数代码

- (NSMutableArray *) loadData
{
    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
    
    NSMutableArray *list = [userDefault objectForKey:kSchoolList];
    
    return list;
    
}

日志只说:线程 1:程序收到信号“SGABRT”

当我第一次运行程序并添加时,很好,我再次添加学校,然后只是它崩溃,在 [loadedArray addobject:schools] 崩溃;

【问题讨论】:

  • 你能发布崩溃日志吗?
  • NSMutableArray *loadedArray = [self loadData];确保[self loadData] 返回的数组也是可变的...否则,请执行此操作并重试NSMutableArray *loadedArray = [[self loadData]mutable copy];
  • 试试这个 NSMutableArray *loadedArray = [[NSMutableArray alloc] initWithArray:[self loadData]];
  • 您好,感谢您的回答,mutableCopy 是正确的。现在可以正常使用了。

标签: iphone objective-c memory-management nsarray


【解决方案1】:

您的代码看起来很清晰。唯一的白点是您在[self loadData] 方法中创建数组的方式。

您提到您从NSUserDefaults 恢复它。可能您只需通过[[NSUserDefaults standardUserDefaults] objectForKey:@"schools"] 将其返回即可。

由于objectForKey: 方法返回id 类型对象,因此您不会收到警告说objectForKey: 返回NSArray 而不是NSMutableArray

做这样的事情:

return [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"schools"]];


我希望我猜对了你的代码;)

【讨论】:

    【解决方案2】:

    如果你把日志贴出来会很有帮助,这样我们就会知道崩溃到底是什么。我假设在某些时候您将 tempArray 的值存储到加载中。尝试将您的代码更改为此

     NSMutableDictionary *schools = [[NSMutableDictionary alloc] init];
        [schools setObject:name forKey:kFavoriteSchoolName];
        //load data is getting data from NSUserDefault which I save
        NSMutableArray *loadedArray = [[self loadData] retain];
    
    //if loadedarray has object in there, then continue adding schools to it or make new array
    if([loadedArray count] > 0)
    {
        if([loadedArray isKindOfClass:[NSMutableArray class]]) {
        [loadedArray addObject:schools];
        }
        else {NSLog(@"Not a mutable array");}
    
        > // it crashes here
    
    
        [schools release];
    
        return [loadedArray autorelease];
    } else
    { 
        [loadedArray release];
        //It will add the school to the array for the first time if there is nothing when it loaded.
    
        NSMutableArray *tempArray = [[[NSMutableArray alloc] init] autorelease];
        [tempArray addObject:schools];
    
        [schools release];
    
        return tempArray;
    }
    

    【讨论】:

    • 感谢您的快速回复,我刚刚编辑了我的问题。请再看看并帮助我。
    【解决方案3】:

    我发现你没有初始化你的数组 loadArray。你 无法向未初始化的 NSMutableArray 添加任何值。

    你需要从初始化开始。

    NSMutableArray *loadArray  = [[NSMutableArray alloc]init];
    

    然后将数据填充到您的数组中

    [loadArray  addObjectsFromArray:[self loadData]];
    

    【讨论】:

      猜你喜欢
      • 2014-06-12
      • 1970-01-01
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多