我在ViewdidLoad中声明了NSString的一些字符串值,如..
int i=1;
strval=[NSString stringWithFormat:@"%03d",i];
strval=[NSString stringWithFormat:@"S%@",strval];
NSLog(@"Value %@",strval);
它给出了正确的结果作为S001,但当我在IBAction中打印时,
- (IBAction)stringvalue:(id)sender {
NSLog(@"Value %@",strval);
}
每次都会给出未知值。有时它会抛出EXEC_BAD_ACCESS错误。
请帮帮我..
答案 0 :(得分:7)
尝试这样的事情
in .h
@property (nonatomic, strong) NSString *strval;
in .m
@synthesize strval = _strval
- (void)viewDidLoad
{
int i = 4;
// ARC
_strval = [NSString stringWithFormat:@"hello %d", i];
// None ARC
// strcal = [[NSString alloc] initwithFormat:@"hello %d",i];
NSLog(@"%@", _strval);
// Prints "hello 4" in console (TESTED)
}
- (IBAction)buttonPress:(id)sender
{
NSLog(@"%@", _strval);
// Prints "hello 4" in console (TESTED)
}
使用ARC。这已经过测试,并按照问题的方式工作。
答案 1 :(得分:4)
看起来您没有使用ARC,因此下次自动释放池耗尽时会释放该字符串。您需要在retain
中明确viewDidLoad
并在您的被覆盖的release
方法中明确dealloc
:
- (void)viewDidLoad
{
...
strval = [[NSString stringWithFormat:@"%03d", i] retain];
....
}
- (void)dealloc
{
[strval release];
...
[super dealloc];
}
(我假设您实际上已将strval
声明为实例方法)。
答案 2 :(得分:3)
in .h
@property (nonatomic, strong) NSString *strval;
in .m
@synthesize strval = _strval
- (void)viewDidLoad
{
...
self.strval = [NSString stringWithFormat:@"%03d", i];
....
}
- (void)dealloc
{
self.strval = nil;
...
[super dealloc];
}
这个也适用于ARC和没有。
只需添加一个:使用ARC时,必须省略语句[super dealloc];
。