【问题标题】:Issue with NSString [closed]NSString 的问题[关闭]
【发布时间】:2013-03-01 04:52:04
【问题描述】:

我的头文件中有一个名为

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

然后它工作得很好。

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

【问题讨论】:

  • @KevinBallard 可能不会。在 ARC 下,这不太可能发生。
  • 应用崩溃时的完整错误信息是什么?

标签: ios objective-c


【解决方案1】:

您提供的信息不足以确切说明问题出在哪里,但听起来问题在于 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 了解更多使用访问器方法是个好主意的原因。

【讨论】:

    【解决方案2】:

    我的头文件中有一个名为

    的字符串

    NSString *enemy;

    这表明这是一个 iVar。

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

    随着每次都被释放并创建新实例。

    【讨论】:

    • 在 ARC 中 strong 是默认的,你不必做任何事情
    • 查看我的更新答案:)
    • 你不需要有一个属性,你也可以有一个ivar,默认的限定符仍然是strong
    • 但是你不知道那个声明在头文件的什么位置。如果它在错误的位置(我们还不知道),它可能是一个全局变量,而不是一个 ivar。
    【解决方案3】:

    在 .h 文件中声明并将属性添加到此变量,更多信息请阅读this document

    @property (nonatomic, strong) NSString *enemy;
    

    我认为这对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多