1

まず、私はObjective-Cの完全な初心者です。これが私の問題です:

オブジェクトを格納する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メソッドはPlayerクラスに属しており、名前とスコアを出力するだけです。

問題は、配列に3人のプレーヤーがいて、コンテンツを印刷しようとすると、printPlayerメソッド内で次のエラーが発生することです。

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

不思議なことに、NSLog(@"%@", object);代わりに使用[object 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
4

4 に答える 4

3

あなたの問題はあなたがあなたのプロパティを定義している方法にあるようです。

強い、またはコピーではなく、割り当てを使用しています。

一言で言えば、それは強いということはあなたがあなたのオブジェクトを保持したいということを意味するからです。

copyを使用するということは、オブジェクトまたは値の新しいコピーを作成し、それをプロパティの値として設定することを意味します... MarioとJarsenが説明するように、配列を操作するときは、配列が変更されないようにコピーを使用することをお勧めします(つまり、値が変更された)、列挙/トラバースされている間。コピーを使用すると、新しいオブジェクトも保持されます。

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

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

何が起こっていたのかというと、変数をプロパティに割り当てていたのに、変数が解放されていて(したがって、nilになって)、クラッシュが発生していたと思います。

ここにいくつかのリンクがあります:

Objective Cの新機能:強力な参照と割り当てを理解するための支援が必要

Objective-C ARC:強いvs保持および弱いvs割り当て

割り当て、保持、コピー、強力についての明確化?

于 2012-04-27T05:08:56.837 に答える
2

playerNameプロパティは、割り当てるのではなくコピーするのが最適です。

@property (nonatomic, copy) NSString *playerName;

割り当てられた値にアクセスしようとすると、オブジェクトがなくなってアクセス不良が発生した可能性があります。

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

乾杯

于 2012-04-27T05:06:01.610 に答える
1

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

for (CustomClass *object in myArray){
  [object printPlayer];
}
于 2012-04-27T00:53:18.453 に答える
1

マイクZが言ったことまたは「原油」のいずれか:

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

より洗練されたスキームがありますが、これが何をしているのか、NS(Mutable)Arrayが標準のC配列の単純なアナログである方法を明確に理解できます。

于 2012-04-27T01:18:19.013 に答える