-3

という名前のヘッダー ファイルに文字列があります。

NSString *enemy;

実装ファイルでは、このような plist ファイルからその文字列を初期化しています

NSString *path = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"plist"];
NSDictionary *data = [NSDictionary dictionaryWithContentsOfFile:path];

NSDictionary *level_data = [data objectForKey:[@"Level" stringByAppendingFormat:@"%d", level]];

enemy = [level_data objectForKey:@"enemy"];

そして、この「敵」文字列を、このようなメソッドで使用すると

-(void) addEnemy{
    if([enemy isEqualToString:@"Ostrich"]){
        [some_Obj valueCalc:t];
    }
}

その「addEnemy」メソッドへの最初の呼び出しでは正常に機能しますが、このメソッドを再度呼び出すと、文字列「enemy」が例外をスローします。デバッグ後、メソッド「addEnemy」への2回目の呼び出しで、文字列「enemy」がデバッガーで「変数はNSStringではありません」と表示されることがわかりました。

しかし、このように「敵」を初期化すると

enemy = [[NSString alloc] initWithString:[level_data objectForKey:@"enemy"]];

その後、それは非常にうまく機能します。

上記の問題が発生する理由を誰か教えてもらえますか?

4

3 に答える 3

0

という名前のヘッダー ファイルに文字列があります。

NSString *敵;

これは、これが iVar であることを示しています。

@property が必要です。strongまた、ARC またはretainMRC で使用する必要があります。

毎回リリースされ、新しいインスタンスが作成されます。

于 2013-03-01T05:02:03.843 に答える
0

.h ファイルで宣言し、この変数にプロパティを追加します。詳細については、このドキュメントを参照してください。

@property (nonatomic, strong) NSString *enemy;

これはあなたに役立つと思います。

于 2013-03-01T05:02:43.803 に答える
0

あなたが提供した情報は、何が問題なのかを正確に言うのに十分ではありませんが、呼び出されるenemy前に割り当てが解除されていることが問題のよう-addEnemyです。@propertyインスタンス変数を直接設定してアクセスする代わりに、アクセサーを使用することで、多くの問題を回避できます。

ヘッダー ファイルで:

@interface MyClass : NSObject

@property (nonatomic, strong) NSString *enemy;

@end

実装 (.m) ファイルで:

- (void)initializationMethod // Don't know what this really is in your code
{
    // get level_data from plist
    self.enemy = [level_data objectForKey:@"enemy"];
}

// Then in -addEnemy:
- (void)addEnemy
{
    if([self.enemy isEqualToString:@"Ostrich"])
    {
        [some_Obj valueCalc:t];
    }
}

// If (and only if) you're not using ARC, you need this. But, really you should use ARC.
- (void)dealloc
{
     [_enemy release];
     [super release];
}

このように、@property の合成されたセッター メソッドが保持enemyを処理するため、割り当てが解除されることはありません。また、特に ARC を使用しない場合は、Objective-C のメモリ管理についても読む必要があります。アクセサー メソッドを使用することをお勧めするその他の理由については、この質問に対する私の回答を参照してください。

于 2013-03-01T05:03:46.833 に答える