2

我已经在 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 错误。

请帮我..

4

3 回答 3

7

尝试这样的事情

在.h

  @property (nonatomic, strong) NSString *strval;

  @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)
  }

使用弧。这已经过测试,并且按照提出问题的方式工作。

于 2012-11-05T14:45:14.007 回答
4

看起来您没有使用 ARC,因此下次自动释放池耗尽时将释放字符串。您需要在覆盖的方法retain中显式地显示它viewDidLoad并显式地显示它:releasedealloc

- (void)viewDidLoad
{
    ...

    strval = [[NSString stringWithFormat:@"%03d", i] retain];

    ....
}

- (void)dealloc
{
    [strval release];

    ...

    [super dealloc];
}

(我假设您实际上已声明strval为实例方法)。

于 2012-11-05T14:44:57.773 回答
3

在.h

  @property (nonatomic, strong) NSString *strval;

  @synthesize strval = _strval   

- (void)viewDidLoad
{
    ...

    self.strval = [NSString stringWithFormat:@"%03d", i];

    ....
}

- (void)dealloc
{
    self.strval = nil;

    ...

    [super dealloc];
}

这个也适用,有 ARC 也有没有。

只有一个补充:对于 ARC,[super dealloc];必须省略该语句。

于 2012-11-05T14:54:02.650 回答