目标C:为什么我的NSMutableArray不起作用?

时间:2010-11-20 19:49:01

标签: objective-c arrays cocoa null nsmutablearray

我对ObjC及其可变数组很新。这让我发疯; - )

我执行以下操作:

mColumns = [NSMutableArray array];
for( int i=0; i<5; i++ ) [mColumns addObject:[[MyColumn alloc] init]];

在那段代码之后,我的数组“mColumns”包含5个元素。但它们每个都是一个NULL指针! (或者至少那是调试器告诉我的)。 我已经检查了代码

[[MyColumn alloc] init]

给了我一些有效的对象,所以我不知道为什么我的数组充满了0x0。 你能给我一个暗示吗?

3 个答案:

答案 0 :(得分:2)

如果你想让它坚持下去,请保留你的mutableArray。在当前事件循环结束时,它将自动解除分配,就像在autoreleasePool中一样。

此时所有赌注都已关闭。你的 mColumns 变量只指向一块垃圾内存,可能是另一个对象,也许是半个对象,甚至你仍然可以得到正确的数量甚至是一个包含的对象,但在某些时候你的应用程序将会崩溃。

只是一个快速点,如果[[mColumns objectAtIndex:x] addObject:g];崩溃你的应用是导致崩溃的[mColumns objectAtIndex:x]还是addObject:g

为什么不把它们分开来找出来?

答案 1 :(得分:0)

我知道你说对象分配正确,但我倾向于检查它。这是相同的代码和更多的调试:

NSMutableArray *mColumns = [NSMutableArray array];
for( int i=0; i<5; i++ ) {
  MyColumn *col = [[MyColumn alloc] init];
  NSLog(@"%d: %@", i, col);
  [mColumns addObject:col];
  [col release];
}
NSLog(@"Array has %d elements, first is %@", [mColumns count], [mColumns objectAtIndex:0]);

问题可能是(a)没有正确创建对象,或者(b)数组确实有元素而你有不同的问题。

答案 2 :(得分:0)

嗯。我可以在您的代码中看到一个问题,但不会出现导致此问题的问题:您要将保留的对象添加到数组中;你首先想要自动释放那些,这样你就不会泄漏。

至于你的实际问题,我不知道。用空指针填充数组是不可能的;只有id类型的对象(非任意指针)才能放在NSArray / NSMutableArray内。

我知道你说你已经检查了-[MyColumn init],但是检查它是否在这个地方产生了正确的物体是个好主意。

columns = [NSMutableArray array];
for (int i = 0; i < 5; i++) {
  id c = [[[MyColumn alloc] init] autorelease];
  /* set a breakpoint here, and type `po c`
     into the debugger to see what was created
   */
  [columns addObject:c];
}

除非-[MyColumn init]制作一些非常时髦的物品,否则我无法弄清楚问题会是什么。 我想知道mColumns是否发生了一些奇怪的事情;它是由任何东西保留的,例如?