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

ARCを使用。これはテスト済みで、質問が尋ねられた方法で機能します。

于 2012-11-05T14:45:14.007 に答える
4

ARC を使用していないように見えるため、次回自動解放プールがドレインされるときに文字列が解放されます。オーバーライドされたメソッドで明示的retainにそれを明示的に指定する必要があります。viewDidLoadreleasedealloc

- (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 の有無にかかわらず機能します。

1 つだけ追加: ARC ではステートメント[super dealloc];を省略しなければなりません。

于 2012-11-05T14:54:02.650 に答える