NSArray的声明和关于安全的指针问题?

时间:2011-07-13 19:13:27

标签: objective-c cocoa-touch

期望的结果是在NSArray中构建10列。以下内容适用于所需的结果。
但我在这里玩火吗?

NSArray **ppp;

int m=10;

ppp = calloc(m, sizeof(NSArray));

ppp[0]=[[NSArray alloc] initWithObjects:
                 @"1",
                 @"2",
                 @"3",
                 ];

ppp[1]=[[NSArray alloc] initWithObjects:
            @"a1",
            @"b2",
            @"c3",
            @"d4",
            nil
            ];

NSLog(@"array test: %@   %@", [ppp[1] objectAtIndex:3], [ppp[0] objectAtIndex:2]);

感谢

3 个答案:

答案 0 :(得分:3)

如果您打算这样做,

ppp = calloc(m, sizeof(NSArray *));

但采用此路径将涉及阵列数组的手动内存管理。为什么不使用NSMutableArray实例。

NSMutableArray * masterArray = [NSMutableArray array];
[masterArray addObject:[[NSArray alloc] initWithObjects:
                 @"1",
                 @"2",
                 @"3",
                 ]];

.....

NSLog(@"array test: %@ ", [[masterArray objectAtIndex:1] objectAtIndex:3]);

答案 1 :(得分:3)

它应该是sizeof(id),否则它是正确的代码。但是那里存在一些“爆炸”的可能性,因为它会使内存管理变得更加复杂并且容易出错,因此使用NSArray(因为C阵列完全不了解Objective-C的内存管理要求)。除非你已经分析并发现它是必要的,否则我会质疑这一点。

答案 2 :(得分:1)

你的calloc是错的。如果你想要一个包含10个NSArray对象的缓冲区,请执行:

NSArray** ppp;
int m = 10;
ppp = calloc(m, sizeof(NSArray*));

...

问题是某些体系结构上的sizeof(int)!= sizeof(id)。你自己做短片,你会粉碎你的堆,当你写完你的数组结束时你会遇到malloc异常。此外,很难找到错误。

我同意InsertWittyName:只需制作NSArray的NSArray。它更容易,更安全。