2013-03-01 88 views
-3

我在名爲問題與的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"]; 

,然後這個「敵人」頭文件中有一個字符串字符串,當我用這樣的方法

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

它工作正常的第一次調用該「addEnemy」的方法,但是當我再次調用這個方法的字符串「敵人」拋出一個異常。調試後,我知道在第二次調用方法「addEnemy」時,字符串「enemy」在調試器中顯示「變量不是NSString」。

,但如果我初始化「敵人」這樣的

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

然後它工作相當精細。

誰能告訴我爲什麼會出現上述問題?

+2

這是ARC嗎? – 2013-03-01 04:57:27

+0

@KevinBallard可能不是。在ARC之下,這不太可能發生。 – 2013-03-01 05:10:31

+0

應用程序崩潰時,完整的錯誤消息是什麼? – rmaddy 2013-03-01 05:29:21

回答

0

您提供的信息不足以說明確切的錯誤,但聽起來問題是在調用-addEnemy之前enemy正在被釋放。通過使用@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,其中一些原因是爲什麼使用訪問器方法是個好主意。

0

我在一個名爲

NSString的頭文件中的字符串*敵人;

這表明這是一個iVar。

您需要擁有@property。 而且您必須使用ARC中的strong或MRC中的retain

隨着每次發佈和新實例創建。

+1

在ARC'強'是默認的,你不必做一件事 – 2013-03-01 05:03:06

+0

看到我更新的答案:) – 2013-03-01 05:04:36

+1

你不需要有一個屬性,你也可以有一個ivar,默認限定符仍然是' strong'。 – 2013-03-01 05:06:23

0

在.h文件中聲明並向此變量添加屬性,其他信息請參閱this document

@property (nonatomic, strong) NSString *enemy; 

我認爲這對你有幫助。