【问题标题】:Problem adding object to NSMutableArray将对象添加到 NSMutableArray 时出现问题
【发布时间】:2011-08-26 23:10:39
【问题描述】:

我在向我的 NSMutableArray 添加对象时遇到问题。似乎添加了一些东西(对象计数在调试器中增加 1),但唯一添加的是 0x0(空)而不是对象的地址。我已经阅读了我能找到的所有相关的东西,但我找不到任何似乎可以回答这个问题的东西。大多数相关帖子似乎都围绕着内存管理,但解决方案并没有跳出来。

感谢您提供的任何帮助。

我已经包含了我认为是代码的相关部分。如果您需要查看更多内容,请告诉我。

GamePlayView.h

@interface GamePlayView : UIViewController 
{
    Player *gamePlayer;
    NSMutableArray *boardObjects;
}

@property (retain, nonatomic) Player *gamePlayer;
@property (retain, nonatomic) NSMutableArray *boardObjects;

@end

GamePlayView.m

- (void)viewDidLoad 
{
    // Create player

    Player *tempPlayer = [[Player alloc] initWithFrame: self.view.frame];
    if (tempPlayer == NULL) {
        NSLog(@"GamePlayView viewDidLoad: null Player");
    }
    else gamePlayer = tempPlayer;

    // Create array of board objects

    NSMutableArray *newArray = [[NSMutableArray alloc] init];

    self.boardObjects = newArray;
    [self.boardObjects addObject: gamePlayer];  // First breakpoint here
    topObject = 0;

    BoardObject *mine = [[BoardObject alloc] initWithFrame: self.view.frame];

    [self.boardObjects addObject: mine];  // Second breakpoint here
    topObject = 1;

    [super viewDidLoad];

} // End viewDidLoad

我在 addObject 行放置断点(在代码中注释)。当执行在第一个断点处停止时,调试器会显示一个好的 tempPlayer 和一个好的 gamePlayer(两者都具有相同的地址)。它在 boardObjects 中显示 0 个对象,如下所示:

boardObjects = (_NSArrayM *) 0x4b22080 0 objects

当我越过这个断点时,调试器在boardObjects中显示1个对象,如下:

boardObjects = (_NSArrayM *) 0x4b22080 1 objects
    0 = (NSObject *) 0x0

当我继续执行程序,并且调试器在下一个断点处停止时,我还看到了一个好的我的对象,boardObjects 仍然如上所述。跨过这个断点后,boardObjects 现在看起来像这样:

boardObjects = (_NSArrayM *) 0x4b22080 2 objects
    0 = (NSObject *) 0x0
    1 = (NSObject *) 0x0

【问题讨论】:

  • NSArray 不能容纳 nil。我无法解释您在调试器中看到的内容。
  • 你的表现似乎不够。您有一个变量 gamePlayer,但它不是局部变量,而且似乎也没有在 @interface 中声明。那是什么?你为什么要第二次添加它,而不是我的对象?又为什么只分配了矿而没有初始化呢?
  • 无法根据我在这里看到的情况来解释这一点,但有几个问题:(1)gamePlayer 是如何声明的(2)你是在使用垃圾收集还是 ARC(3)为什么是 BoardObject已分配但未初始化 (4) 您是否有意将 gamePlayer 添加到数组中两次
  • 感谢鲁迪和蒂姆。很好的问题和观察。 gamePlayer 是 GamePlayView 的一个属性。第二个 addObject 应该是我的,而不是 gamePlayer。矿井应该被初始化。我已经调整了上面的代码以反映这三个问题。我不知道我使用的是垃圾收集还是 ARC。我没有特别选择任何东西。如何检查?
  • 在调试器显示gamePlayer和我的之前你把它们放入数组中。当您发现这些值为 nil 时,请查看您在 Player 和 BoardObject 中的 init 实现,并意识到 init 方法没有返回“this”。

标签: objective-c ios arrays


【解决方案1】:

这可能是因为tempPlayer是一个局部变量,从函数返回后,局部变量会自动释放。

【讨论】:

  • 我无法想象会发生这种情况,除非 tempPlayer 是自动释放的。我没有在代码中看到这种情况。
【解决方案2】:

有人建议我在代码中显示 boardObjects,即使从调试器中看起来我只有空对象。我在最后一个 addObject 之后插入了这段代码:

NSLog(@"self.boardObjects is: %@", [self.boardObjects description]);

这显示了很好的对象:gamePlayer 和地雷!

我确实在此 NSLog 语句之前和之后验证了,调试器仍然在 boardObjects 中显示两个空条目。

那么,我原来的问题的答案似乎是代码本身是正确的。但是,现在我似乎有了一个新问题:这是否意味着我永远无法从调试器中查看 NSMutableArray?

【讨论】:

    【解决方案3】:

    您应该将@property 分配给self.

    self.gamePlayer = tempPlayer;
    

    【讨论】:

      猜你喜欢
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      相关资源
      最近更新 更多