【问题标题】:NSMutableArray always empty?NSMutableArray 总是空的?
【发布时间】:2012-10-15 09:19:13
【问题描述】:

理解 Obj-C 的记忆体及其一些概念仍有一些困难。

所以我的主类包含一个NSMutableArray,其中包含一些角色及其武器列表。是这样的:

在主类.h

@property (nonatomic, retain) NSMutableArray *players;

在 Main class.m 的 init 中

for(int i = 0 ; i < 30 ; i++)
{
    [players addObject:[[PlayerInGame alloc] init:[self.tabPlayers objectAtIndex:i] :[self.tabWeapons:objectAtIndex:i]]];
}

PlayerInGame.h

@property (nonatomic, retain) NSMutableArray *weaponsList;

PlayerInGame.m

- (id) init : (Player*) player : (Weapon*) weapon
{
    [self.weaponsList addObject:weapon];
    // Then I try NSLog of weaponsList's count.
}

这里的武器列表总是空的。怎么了?

【问题讨论】:

标签: objective-c nsmutablearray nsarray


【解决方案1】:

其他答案是正确的。在任何其他语言上,如果您引用未分配的对象,您将获得 NullPointerException。但是在目标 C 中,发送到 nil 的方法只返回 0,它不会使应用程序崩溃。如果您想进一步阅读,请阅读 this

这就是为什么

[self.weaponsList addObject:weapon];

没有崩溃,而在 java 中,如果您尝试将对象添加到未分配的数组中,您的程序将崩溃。正如其他答案指出的那样,声明

self.weaponsList = [[[NSMutableArray alloc] init] autorelease];

分配内存来存储数组,并返回对变量武器列表的引用。现在武器列表!= nil。

【讨论】:

  • 虽然给出的解决方案是正确的,但解释是错误的。您不会收到异常,因为 nil 被运行时视为有效对象,并且发送到 nil 的任何消息都会立即返回,返回值为 0(或等效为 nil)。 [nil count] 因此返回 0。
【解决方案2】:

在添加任何对象之前,您必须先分配您的数组。您可以在viewDidLoad 方法中使用以下代码

 NSMutableArray *players = [[NSMutableArray allo]init]; 
 NSMutableArray weaponsList = [[[NSMutableArray alloc] init]

【讨论】:

    【解决方案3】:

    我还没有看到武器列表对象分配。你初始化了吗?

    self.weaponsList = [[[NSMutableArray alloc] init] autorelease];
    

    PS:小建议。方法“- (id) init : (Player*) player : (Weapon*) Weapon” 签名会更好看,如果您将其更改为更容易使用

    - (id) initWithPlayer:(Player *)player weapon:(Weapon *)weapon
    

    【讨论】:

      【解决方案4】:

      我还建议更改您的初始化语法并使用对象初始化数组:

      - (id) initWithPlayer:(Player *)aPlayer weapon:(Weapon *)aWeapon {
          self.weaponsList = [NSMutableArray arrayWithObject:aWeapon];
          [self.weaponsList retain];
          // remember to release inside dealloc, or use autorelease
      }
      

      【讨论】:

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