我的头文件中有一个字符串名为
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;
我认为这对你有帮助。