我的头文件中有一个名为
的字符串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"]];
然后它运作得很好。
谁能告诉我为什么会出现上述问题?
答案 0 :(得分:0)
我的头文件中有一个名为
的字符串NSString *敌人;
这说明这是一个iVar。
你需要一个@property。
您必须在ARC中使用strong
或在MRC中使用retain
。
每次发布时都会创建新实例。
答案 1 :(得分:0)
答案 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 answer至this question了解更多使用访问者方法的原因。