Objective C二维数组内存问题

Posted

技术标签:

【中文标题】Objective C二维数组内存问题【英文标题】:Objective C two-dimensional array memory issues 【发布时间】:2011-02-16 23:27:25 【问题描述】:

我正在尝试将二维数组声明为 Objective C 中的实例变量。我在标头(数据)中有 NSMutableArray 以及 @property(非原子,保留)。在 viewDidLoad: 我有:

data = [[NSMutableArray alloc] init];
[data addObject:[[NSArray alloc] initWithObjects:@"Cheese", @"Meat", @"Veggie", nil]];
[data addObject:[[NSArray alloc] initWithObjects:@"Sandwich", @"Soup", @"Stew", nil]];

我可以在方法中对数组进行 NSLog 记录,这是正确的,但是当我尝试从单独的方法记录它时,我什么也得不到(只有“@”),如果我尝试使用访问

NSInteger num = [[data objectAtIndex:component] count];

它崩溃了,日志中没有错误。我确信这与没有正确分配内存有关,但是我是 Obj C 的新手,并且多年来没有使用过 C 风格的语言。 FWIW,我尝试了很多变体,但都失败了,包括使用 NSArray 代替 mutable、[NSArray arrayWithObjects] 代替 [[NSArray alloc] initWithObjects],以及两者之间的每种组合。

【问题讨论】:

忽略最后一条评论,抱歉。我假设您已经检查并且组件在数组的范围内? 【参考方案1】:

尝试像这样创建外部数组:

 self.data = [NSMutableArray arrayWithCapacity:2];  // assuming you're only adding 2 inner arrays.

【讨论】:

您需要 self.data 才能正确保留数组。 @jamihash 不是为了原始问题,不。 alloc/init 模式已经返回了一个保留实例,在非 GC 环境中执行 self.data 只会导致第二次保留和内存泄漏。【参考方案2】:

以下可能是正确的方法。

self.data = [NSMutableArray array];
[data addObject:[NSArray arrayWithObjects:@"Cheese", @"Meat", @"Veggie", nil];
[data addObject:[NSArray arrayWithObjects:@"Sandwich", @"Soup", @"Stew", nil];

请注意,正如上面@jamihash 评论的那样,您需要 self.data 才能正确保留数组。而且,您添加到dataNSArray 也不需要alloc

【讨论】:

【参考方案3】:

作为一个附带问题,您将保留子数组两次。当您将它们添加到 NSMutableArray 时,它们会被保留,因此您可能应该在创建时自动释放它们,或者使用返回自动释放数组的 NSArray 方法之一创建它们。

您的代码本身不应崩溃。您应该查看何时何地释放和保留 NSMutableArray。您可以发布更多代码,我相信有人会发现问题。

【讨论】:

以上是关于Objective C二维数组内存问题的主要内容,如果未能解决你的问题,请参考以下文章

C 语言二级指针作为输入 ( 二维数组 | 二维数组内存大小计算 | 指针跳转步长问题 )

C 语言数组 ( 验证二维数组内存是线性的 | 打印二维数组 | 以一维数组方式打印二维数组 | 打印二维数组值和地址 )

C 语言二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )

使用 NULL 数组将内存分配给二维数组 (c)

C语言中二维数组行指针是啥

C 语言二级指针 内存模型图 ( 指针数组 | 二维数组 | 自定义二级指针内存 )