【问题标题】:Objective C: Why doesn't my NSMutableArray work?目标 C:为什么我的 NSMutableArray 不起作用?
【发布时间】:2010-11-20 19:49:01
【问题描述】:

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

我执行以下操作:

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

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

[[MyColumn alloc] init]

给了我一些有效的对象,所以我不知道为什么我的数组会被 0x0s 填充。 能给我一个提示吗?

【问题讨论】:

  • NSMutableArray 不能保存 Null 指针。不知何故,您错误地解释了调试器。您可能想要更具体地说明是什么让您认为它们为 Null。代码没有问题。
  • 别忘了释放这些列。你分配了它们,所以你需要释放它们。请记住,集合拥有其中的对象,因此只要它们在数组中,它们就不会消失。 developer.apple.com/mac/library/documentation/Cocoa/Conceptual/…
  • Mh 调试器显示为数组“NSObject* 0x0 Out of scope”的内容。这对我来说听起来很空。同样在操作数组中的对象时,例如“[[mColumns objectAtIndex:x] addObject:g];”应用崩溃。
  • 好的,调试器在什么时候说“NSObject* 0x0”?立即还是稍后?如果需要保留阵列,您将保留阵列,对吧?
  • +1 表示您可能没有保留阵列并且它正在从您身上自动释放。

标签: objective-c arrays cocoa null nsmutablearray


【解决方案1】:

如果您希望 mutableArray 继续存在,请保留它。在当前事件循环结束时,它将被自动释放,就像它在 autoreleasePool 中一样。

那时所有的赌注都被取消了。您的 mColumns 变量只是指向一块垃圾内存,可能是另一个对象,可能是半个对象,甚至可能您仍然可以获得正确的计数甚至是包含的对象,但是在某些时候您的应用程序会碰撞。

简单来说,如果[[mColumns objectAtIndex:x] addObject:g]; 使您的应用程序崩溃,是[mColumns objectAtIndex:x] 导致崩溃还是addObject:g?

为什么不把它们放在不同的行上找出来呢?

【讨论】:

    【解决方案2】:

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

    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) 数组确实有元素,而您遇到了不同的问题。

    【讨论】:

    • 如果init 正在返回nil,则提问者在尝试将其添加到数组时会遇到异常,因为数组不能包含nil。由于提问者能够添加所有五个对象,init 每次都返回一个对象;即使对象以某种方式错误或不完整地初始化,它的指针也不会是nil;它不会被记录为0x0。
    【解决方案3】:

    嗯。我可以在您的代码中看到一个问题,但没有一个会导致此问题的问题:您正在将保留对象添加到数组中;您需要先自动释放它们,以免泄漏。

    至于你的实际问题,我不知道。用空指针填充数组是不可能的;只有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 是否发生了一些奇怪的事情;例如,它是否被任何东西保留?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      相关资源
      最近更新 更多