功能调用中缺少哨兵?

时间:2011-07-15 04:03:19

标签: objective-c cocoa-touch

我不确定为什么会收到“函数调用中缺少哨兵?”

NSMutableArray *kkk = [NSMutableArray arrayWithObjects: @"a", @"b", @"cat", @"dog", nil];
ppp = [NSMutableArray arrayWithCapacity:3];
[ppp addObject:[[NSMutableArray alloc] initWithObjects: kkk]]; // <<--- Missing sentinel in function call
[ppp addObject:[[NSMutableArray alloc] initWithObjects: kkk, nil]]; //<<--- change, but it falls out

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

2 个答案:

答案 0 :(得分:6)

initWithObjects:必须以尾随nil终止。由于它是单个对象,因此您应该能够使用initWithObject:。也就是说,你会像这样泄漏数组。做

[ppp addObject:[NSMutableArray arrayWithObject:kkk]];

这里的代码还有一个问题,

NSMutableArray *kkk = [NSMutableArray arrayWithObjects: @"a", @"b", @"cat", @"dog", nil];
ppp = [NSMutableArray arrayWithCapacity:3];
[ppp addObject:[[NSMutableArray alloc] initWithObjects: kkk, nil]];

您正在创建一个三维数组。所以

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

错了。

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

应记录正确的值。

但是如果你需要一个基于日志语句的二维数组,我会说你需要这样做,

[ppp addObject:kkk];

答案 1 :(得分:4)

您需要添加nil作为列表中的最后一个对象。

[ppp addObject:[[NSMutableArray alloc] initWithObjects: kkk, nil]];

基本上它告诉方法停止寻找更多对象。没有它,它可以查看错误的指针并崩溃。