0

メソッドで文字列の値を設定viewdidloadし、ボタンアクションメソッドで文字列値を取得すると、アプリがクラッシュします。クラッシュの理由と値をメソッドに渡す方法を知ることができますか?

.hファイル内

NSString *test;

.mファイル内

-(void)viewDidLoad 
{
    test = [NSString stringWithFormat:@"sample"];
}

-(IBAction) buttonPressed:(id)sender 
{
    NSLog(@"%@", test);
}

ボタンを押すと、アプリがクラッシュします。

4

3 に答える 3

2

このソリューションを使用してみてください、これはあなたを助けると思います、

testこのようにファイル内にのプロパティを作成し.hます、、

@property(nonatomic,retain) NSString *test;

そしてsynthesizeそれは.mこのようなファイルで、

@synthesize test;

このように.mファイルのように使用testします。self.test

-(void)viewDidLoad 
{
    self.test = [NSString stringWithFormat:@"sample"];
}

-(IBAction) buttonPressed:(id)sender 
{
    NSLog(@"%@", self.test);
}

これに対する別の解決策は、retainそのtest文字列だけViewDidLoadでもあります。これも役立つと思います。

これがお役に立てば幸いです。

于 2012-08-01T11:36:05.790 に答える
2

それをもっと詳しく説明しようと思います:

ファイルに文字列変数があり.hます。ビューでロードされましたが、次のように割り当てています。

test = [NSString stringWithFormat:@"sample"];

このコードで実際に起こっているのは、テストが自動解放されたオブジェクトです。これとオブジェクトを使用せずに使用するallocと、initこれは自動解放されたオブジェクトであり、占有したメソッドの後にメモリを解放します。

この状況を回避するために、プロパティを作成することで@Mehulのソリューションを使用できます。これはカプセル化の概念に反します。クラス外でアクセスしたくないオブジェクトや、オブジェクトと一緒に表示したくないオブジェクトがある場合があります。これらの条件では、以下を使用してください。

test = [[NSString stringWithFormat:@"sample"] retain]; // or
test = [[NSString alloc] initWithFormat:@"sample"];

これにより、ストリングを解放するまでストリングが存続します。

使用するのは良くないが、あなたがそれをよりよく理解できるようにあなたに伝えたい別の方法があります。使用する

test = @"sample";

文字列を追加したり、フォーマットで使用したりしたくない場合は、オブジェクトに単純な文字列を割り当てることができNSStringます。

retainCountこれを使用すると、テスト変数が無限になります。これを使用してクラッシュを回避できますが、これは無限であると言ったので、retaiCount使用後に解放してメモリを解放することはできないため、これは好ましくありません。したがって、以前の方法の方が正確です。

これは、ではなくクラスメソッドで作成されたすべての自動解放オブジェクトに当てはまりますinit

これがあなたをもっとクリアすることを願っています。

于 2012-08-01T11:43:14.533 に答える
0

単純な割り当てで問題は解決すると思います。viewDidLoadメソッドでこのコードを置き換えるだけです

-(void)viewDidLoad {

test=[[NSString alloc]initWithString:@"Sample"];

}

于 2012-08-01T11:47:42.963 に答える