0

ねえ、私はObjective-C 2.0とXcodeを初めて使用するので、ここで初歩的なものが欠けている場合はご容赦ください。とにかく、私は新しいビューを表示するためにGameViewと呼ばれる独自のUIViewControllerクラスを作成しようとしています。ゲームを動作させるには、plistファイルからロードするNSArrayを追跡する必要があります。正しいNSArrayをインスタンス変数にロードしたいメソッド「loadGame」を作成しました。ただし、メソッドの実行後、インスタンス変数は配列を追跡できなくなるようです。コードを表示するだけで簡単になります。

    @interface GameView : UIViewController {
        IBOutlet UIView *view 
        IBOutlet UILabel *label;
        NSArray *currentGame;
    }

    -(IBOutlet)next;
    -(void)loadDefault;
...
@implementation GameView
- (IBOutlet)next{
   int numElements = [currentGame count];
   int r = rand() % numElements;
   NSString *myString = [currentGame objectAtIndex:(NSUInteger)r];
   [label setText: myString];
}
- (void)loadDefault {
    NSDictionary *games;
    NSString *path = [[NSBundle mainBundle] bundlePath];
    NSString *finalPath = [path stringByAppendingPathComponent:@"Games.plist"];
    games = [NSDictionary dictionaryWithContentsOfFile:finalPath];
    currentGame = [games objectForKey:@"Default"];
}

loadDefaultが呼び出されると、すべてが完全に実行されますが、後でnextへのメソッド呼び出しでcurrentGame NSArrayを使用しようとすると、currentGameはnilのように見えます。このコードのメモリ管理の問題も認識しています。この問題については、どんな助けでもいただければ幸いです。

4

2 に答える 2

2

そのコードが機能した場合、私は驚きます。本当にGames.plistあなたのバンドルのトップレベルにいますか?バンドルのリソースフォルダ、ドキュメント、またはアプリケーションサポートにありませんか?メソッドをデバッグすると、正しく配置されていないことがわかります。

于 2010-06-10T18:35:37.630 に答える
0

-objectForKey:所有するオブジェクトは返されません。保持することにより、明示的に所有権を取得する必要があります。

currentGame = [[games objectForKey:@"Default"] retain];

または、宣言されたプロパティを使用して:

@interface GameView ()
@property (readwrite, retain) NSArray *currentGame;
@end

@implementation GameView
@synthesize currentGame;
// ...
- (void)loadDefault {
    // ...
    self.currentGame = [games objectForKey:@"Default"];
于 2010-06-10T18:32:03.810 に答える