将对象添加到NSMutableArray时出现问题

时间:2011-08-26 23:10:39

标签: objective-c ios arrays

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

感谢您提供的任何帮助。

我已经包含了我认为代码的相关部分。如果您还需要了解更多信息,请告诉我。

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

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

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

3 个答案:

答案 0 :(得分:0)

这可能是tempPlayer是局部变量的情况,从函数返回后,局部变量会自动释放。

答案 1 :(得分:0)

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

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

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

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

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

答案 2 :(得分:0)

您应该为@property分配self.

self.gamePlayer = tempPlayer;