2

にいくつかのデータを保存しようとしていNSMutableArrayます。これは私の構造体です:

typedef struct{
    int time;
    char name[15];
}person;

これは人を追加するコードです:

person h1;
h1.time = 108000;
strcpy(h1.name, "Anonymous");
[highscore insertObject:[NSValue value:&h1 withObjCType:@encode(person)] atIndex:0];

だから、私はこの方法で抽出しようとします:

NSValue * value = [highscore objectAtIndex:0];
person p;
[value getValue:&p];
NSLog(@"%d", p.time);

問題は、最終ログに 108000 が表示されないことです!
なにが問題ですか?

4

3 に答える 3

2

あなたのコードは正しいように見える(そして私にとってはうまくいく)ので、初期化していないと推測しますhighscore。そのため、insertObject:atIndex:メッセージを送信しても何も起こりません。次にメソッドを送信するobjectAtIndex:と、nil が返されます。getValue:nilに送信すると、NSValue *value何もしないため、person pランダムなスタック ガベージがいっぱいになるため、 NSLog108000 が出力されません。

于 2012-07-06T17:01:01.147 に答える
1

私の最初のコメントで述べたように、純粋な C 構造体でこの種のことを行う理由はめったにありません。代わりに、実際のクラス オブジェクトを使用します。

以下の構文に慣れていない場合は、ObjC 2.0 に関するこれらの簡単なチュートリアルを参照したり、Apple のドキュメントを読んだりすることをお勧めします。

人物クラス:

// "Person.h":
@interface Person : NSObject {}

@property (readwrite, strong, nonatomic) NSString *name;
@property (readwrite, assign, nonatomic) NSUInteger time; 

@end

// "Person.m":
@implementation Person

@synthesize name = _name; // creates -(NSString *)name and -(void)setName:(NSString *)name
@synthesize time = _time; // creates -(NSUInteger)time and -(void)setTime:(NSUInteger)time

@end

クラスの使用:

#import "Person.h"

//Store in highscore:

Person *person = [[Person alloc] init];
person.time = 108000; // equivalent to: [person setTime:108000];
person.name = @"Anonymous"; // equivalent to: [person setName:@"Anonymous"];
[highscore insertObject:person atIndex:0];

//Retreive from highscore:

Person *person = [highscore objectAtIndex:0]; // or in modern ObjC: highscore[0];
NSLog(@"%@: %lu", person.name, person.time);
// Result: "Anonymous: 108000"

デバッグを簡単にするために、次のメソッドPersonを実装することもできます。description

- (NSString *)description {
    return [NSString stringWithFormat:@"<%@ %p name:\"%@\" time:%lu>", [self class], self, self.name, self.time];
}

これにより、ロギングのためにこれを行うことができます:

NSLog(@"%@", person);
// Result: "<Person 0x123456789 name:"Anonymous" time:108000>
于 2012-07-06T16:24:04.120 に答える
0

Person を Objective-C オブジェクトとして再実装し、メリットを享受します。

Person.h:

@interface Person : NSObject
{
    int _time;
    NSString *_name;
}

@property (assign, nonatomic) int time;
@property (retain, nonatomic) NSString *name;

@end

Person.m:

#import "Person.h"

@interface Person
@synthesize time = _time;
@synthesize name = _name;

- (id)init
{
    self = [super init];
    if (self != nil)
    {
        // Add init here
    }
    return self;
}

- (void)dealloc
{
    self.name = nil;
    [super dealloc];
}

@end
于 2012-07-06T16:16:55.643 に答える