0

Obj-C のメモリのジェスションとその概念のいくつかを理解するには、まだいくつかの困難があります。

したがって、私のメイン クラスには、NSMutableArrayいくつかのキャラクターとその武器のリストを含む が含まれています。こんな感じです :

Main class.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.
}

ここで WeaponList は常に空です。なにが問題ですか?

4

4 に答える 4

3

他の答えは正しいです。他の言語では、割り当てられていないオブジェクトを参照すると、NullPointerException が発生します。しかし、Objective C では、nil に送信されたメソッドは 0 を返すだけで、アプリをクラッシュさせることはありません..さらに読みたい場合は、これを読んでください

それが理由です

[self.weaponsList addObject:weapon];

クラッシュしませんでしたが、Java で未割り当ての配列にオブジェクトを追加しようとすると、プログラムがクラッシュします。他の回答が指摘したように、ステートメント

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

配列を格納するためのメモリを割り当て、変数weaponListへの参照が返されます。今weaponList != nil.

于 2012-10-15T09:28:49.700 に答える
3

オブジェクトを追加する前に、配列を割り当てる必要があります。viewDidLoadメソッドで次のコードを使用できます

 NSMutableArray *players = [[NSMutableArray allo]init]; 
 NSMutableArray weaponsList = [[[NSMutableArray alloc] init]
于 2012-10-15T09:22:43.137 に答える
2

init 構文を少し変更して、オブジェクトで配列を初期化することもお勧めします。

- (id) initWithPlayer:(Player *)aPlayer weapon:(Weapon *)aWeapon {
    self.weaponsList = [NSMutableArray arrayWithObject:aWeapon];
    [self.weaponsList retain];
    // remember to release inside dealloc, or use autorelease
}
于 2012-10-15T09:39:27.597 に答える
2

WeaponList オブジェクトの割り当ては見たことがありません。初期化しますか?

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

PS: マイナーなアドバイス。メソッド "- (id) init : (Player*) player : (Weapon*) weapon" の署名は、次のように変更すると見栄えが良くなり、使いやすくなります。

- (id) initWithPlayer:(Player *)player weapon:(Weapon *)weapon
于 2012-10-15T09:22:40.537 に答える