2012-04-27 4 views
1

私はObjective-Cの初心者です。これは私の問題です:NSMutableArrayをトラバースするには?

私は、オブジェクトを格納するNSMutableArrayを持っています。(Player)は、プレーヤーの名前とスコアを持っています。

addObjectを使用してオブジェクトを配列に追加できますが、この配列をトラバースする際に問題があります。この は、私はそれを行う方法です。

// Get the reference to the array 
NSMutableArray *myarray = [delegate getArray]; 
// Create a numerator 
NSEnumerator *e = [myarray objectEnumerator]; 
id object; 
while (object = [e nextObject]) 
{ 
    [object printPlayer]; 
} 

プレイヤークラスに属し、それだけで名前とスコアを出力printPlayer方法。私はNSLog(@"%@", object);代わりの[object printPlayer];それプリントを使用している場合不思議

Thread 1: EXC_BAD_ACCESS(code=1, address=0x0000008) 

私は、アレイ内の3人の選手がいると私はコンテンツを印刷しようとしていたときに問題があるが、それはprintPlayerメソッド内でこのエラーに達しますオブジェクトへの参照で、エラーにはなりません。

誰もが、私は[object printPlayer]

乾杯を使用しようとすると問題が何ができるか私を指すことができ

アップデート1: これは私のprintPlayer方法である:

-(void) printPlayer 
{ 
    NSLog(@"\n\nName: %@\nScore: %d", playerName, playerScore); 
} 

アップデート2 :

Player.h:

@interface PROGPlayer : NSObject 
@property (nonatomic, assign) NSString *playerName; 
@property (nonatomic, assign) int playerScore; 
-(id) init: (NSString *) n; 
-(void) printPlayer; 
@end 

Player.m:

#import "PROGPlayer.h" 
@implementation PROGPlayer 

@synthesize playerName; 
@synthesize playerScore; 
/** 
* Player's class constructor 
* @param n Player's name 
* @param s Player's score 
*/ 
-init: (NSString *) n 
{ 
    if (!(self = [super init])) return nil; 
    else 
    { 
     playerName = n; 
     playerScore = 0; 
    } 
    return self; 
} 

-(void) printPlayer 
{ 
    NSLog(@"\n\nName: %@\nScore: %d", playerName, playerScore); 
} 
@end 
+0

プロジェクト内に自動参照カウントを使用していますか? –

+0

あなたの質問に答えません..一般的な提案ですが、 http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocFastEnumeration.html – Neo

+2

printPlayerコード。投稿できますか? –

答えて

2

あなたのプレイヤー名プロパティは、最高のコピーの代わりに、割り当てられた値にアクセスしようとすると、オブジェクトが最も可能性の高い不正なアクセスを引き起こしてしまっている

@property (nonatomic, copy) NSString *playerName; 

を割り当てる必要があります。

また、プロパティをコピーするように設定すると、deallocでplayerNameを解放することを忘れないでください。

乾杯

+0

これは始まりですが、それでもinitによって保持されることはありません: – davehayden

+0

絶対に、self.playerName = nは彼が必要なものです – Mario

+0

@MarioありがとうMario私は今コピーを使用していて、すべてがスムーズに動作します。自分のプロパティにself.playerName = nとself.playerScore = 0を割り当てています。どうもありがとうございました。 – ivantxo

1

あなただけの配列を列挙したいですか?

for (CustomClass *object in myArray){ 
    [object printPlayer]; 
} 
+0

同じことが起こります。ある時点で、プレイヤー数を増やすと、通常3または4のprintPlayerコードがクラッシュします。 – ivantxo

1

何マイク・Zが言ったか「粗」のいずれか:

for (int i = 0; i < myArray.count; i++) { 
    CustomClass* object = [myArray objectAtIndex:i]; 
    [object printPlayer]; 
} 

よりエレガントなスキームがありますが、あなたは明確にこれをやっているかを理解し、どのようにNS(変更可能な)配列することができます標準的なC配列の単純なアナログです。

3

あなたの問題は、あなたがあなたの特性を定義している方法であるように思えます。あなたはではなく、強い、またはコピーを割り当てるを使用している

一言で言えば、強いは、オブジェクトを保持することを意味します。 コピーを使用して

は、オブジェクトまたは値の新しいコピーを作成したいとあなたのプロパティの値としてあることを設定することを意味し...マリオとJarsenが説明したよう、で作業する際コピーを使用して、より良い習慣ですアレイが列挙されている間に変更されている(つまり、値が変更されていない)ようにします。 コピーも新しいオブジェクトを保持します。

ARCを使用していてオブジェクトが保持されていない場合、オブジェクトはコンパイラによって自動的に解放されます。

割り当てを使用するとは、新しいオブジェクトが他の場所に保持されているとみなし、再度保持したくないということを意味します。

私はあなたの変数にあなたのプロパティを割り当てていたが、変数が解放されていて(したがってnilになって)クラッシュを引き起こしていたとします。ここで

は、いくつかのリンクです:

New to Objective C: Need help understanding strong reference vs assign

Objective-C ARC: strong vs retain and weak vs assign

Clarification on assign, retain, copy, strong?

+0

コピーはMarioが示唆しているように、より良い選択となるでしょう。変更可能なサブクラスを持つNSStringやNSArrayなどの強力なプロパティの代わりにコピーを使用するのは、通常は割り当て時に受け取った値を保持したいので、誤ってその値を変更するのを防ぐためです。 – Jarsen

+1

ありがとう、私の答えを更新しました。 –

+0

@ C4-Travis効果的に私はcopyを使って、自分のプロパティをself.playerName = nとself.playerScore = 0で割り当てています。すべて動作しています!リンクありがとう。 – ivantxo

関連する問題