Issue with NSString



我的头文件中有一个字符串名为

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"];

然后是这个"enemy"字符串,当我在方法中使用它时

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

对于第一次调用"addEnemy"方法可以正常工作,但是当我再次调用该方法时,字符串"enemy"抛出异常。调试后我知道,在第二次调用方法"addEnemy"的字符串"敌人"显示"变量不是NSString"在调试器。

但是如果我像这样初始化"enemy"

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

那么它工作得很好。

谁能告诉我为什么会出现上述问题?

您提供的信息不足以确切说明问题所在,但听起来问题在于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];
}

这样,@属性的合成setter方法会为您保留enemy,这样它就不会从您的下面被释放。你还应该仔细阅读Objective-C内存管理,特别是如果你不打算使用ARC。关于为什么使用访问器方法是个好主意的更多原因,请参阅我对这个问题的回答。

头文件中有一个名为

的字符串

NSString *敌人;

声明这是一个iVar。

你需要有一个@属性。在ARC中必须使用strong,在MRC中必须使用retain

在.h文件中声明并添加属性,详细信息请参阅本文档。

@property (nonatomic, strong) NSString *enemy;

我认为这对你有帮助。

最新更新