2

Ok。クラス「Game」があり、クラス「Board」のインスタンスを作成してテストします。

「Board」クラスには辞書があり、それはどういうわけかその値を維持できないようです(?)コードを最小限に抑えようとしました:

ゲームクラス:

@interface Game : UIViewController{
    Board *board;
}
-(void)testAgain; 

@implementation Game
-(void)setup{
    board = [Board alloc]createBoard];
    [board test]; //returns right value
    [self testAgain]; //returns (null), see output below
}
-(void)testAgain{
    [board test];
}

-(void)didLoad{
    [self setup];
}

ボードクラス:

@interface Board : NSObject{
@property(nonatomic, retain) NSMutableDictionary *dict;

-(Board *)createBoard;
-(void)test;

@implementation Board
@synthesize dict;

-(Board *)createBoard{

    dict = [[NSMutableDictionary alloc]init];

    [dict setObject:@"foo1" forKey:@"1"];
    [dict setObject:@"foo2" forKey:@"2"];
    [dict setObject:@"foo3" forKey:@"3"];
    [dict setObject:@"foo4" forKey:@"4"];
    [dict setObject:@"foo5" forKey:@"5"];

    return self;
}

-(void)test{
    NSLog(@"Test return: %@", [dict objectForKey:@"4"]);
}

次の出力:

2012-06-23 01:05:28.614 Game[21430:207] Test return: foo4
2012-06-23 01:05:32.539 Game[21430:207] Test return: (null)

事前に、助けてくれてありがとう!

4

2 に答える 2

1
@implementation Game
-(void)setup{
    board = [[[Board alloc] init] createBoard];
    [board test]; //returns right value
    [self testAgain]; //returns (null), see output below
}

使用している作成パターンは、Objective-C のすべての規則の外側にあります。[Board new]、[[Board alloc] init|With...|]、または [Board board|With...|] のいずれかを使用する必要があります。

-(Board *)createBoard {

    self.dict = [[NSMutableDictionary alloc]init];

    [dict setObject:@"foo1" forKey:@"1"];
    [dict setObject:@"foo2" forKey:@"2"];
    [dict setObject:@"foo3" forKey:@"3"];
    [dict setObject:@"foo4" forKey:@"4"];
    [dict setObject:@"foo5" forKey:@"5"];
}

欠落している init が属する場所に再インストールされ、わずかに欠落している self を使用して、コードがより適切に機能するかどうかを確認してみましょう。.

于 2012-06-23T00:14:15.917 に答える
0

まず、Boardを使用してオブジェクトを正しく初期化していませんcreateBoardBoardそのメソッドでオブジェクトを返すことすらありません。そのメソッドを次のように変更してみてください。

-(id)initWithCreatedBoard {

self = [super init];


if (self) { 

dict = [[NSMutableDictionary alloc]init];

[dict setObject:@"foo1" forKey:@"1"];
[dict setObject:@"foo2" forKey:@"2"];
[dict setObject:@"foo3" forKey:@"3"];
[dict setObject:@"foo4" forKey:@"4"];
[dict setObject:@"foo5" forKey:@"5"];

[dict retain];

}

自分自身を返します。

}

あなたもしたいかもしれませんretain dict。おそらく割り当てが解除されているためです。

また、ARCを使用していますか?

2 つのメソッドtestAgaintest. test2回呼び出すだけです:

for (int i = 0; i <= 2; i++) {

[self test];

}

より良い構造、それだけです。結果をフィードバックしてください!

于 2012-06-23T00:12:05.123 に答える