-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”时,字符串“enemy”在调试器中显示“Variable is not 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 的合成 setter 方法会enemy为您保留,因此不会从您的下方释放。您还真的应该阅读Objective-C 内存管理,特别是如果您不打算使用 ARC。请参阅这个问题的回答,以了解为什么使用访问器方法是个好主意的更多原因。

于 2013-03-01T05:03:46.833 回答