NSString问题

时间:2013-03-01 04:52:05

标签: ios objective-c

我的头文件中有一个名为

的字符串
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"]];

然后它运作得很好。

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

3 个答案:

答案 0 :(得分:0)

  

我的头文件中有一个名为

的字符串      

NSString *敌人;

这说明这是一个iVar。

你需要一个@property。 您必须在ARC中使用strong或在MRC中使用retain

每次发布​​时都会创建新实例。

答案 1 :(得分:0)

在.h文件中声明并向此变量添加属性,并进一步阅读this document

@property (nonatomic, strong) NSString *enemy;

我认为这对你有帮助。

答案 2 :(得分: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内存管理,你也应该read up,特别是如果你不打算使用ARC。请参阅my answerthis question了解更多使用访问者方法的原因。