2011-06-05 10 views
1

ヘッダファイル:なぜ私の変数はメソッド間で持続しないのですか? - iPhone

NSString *righta; 
@property(nonatomic, retain) NSString *righta; 

(私は通常私の変数のための@property宣言をするが、これは、変数を助けるかもしれないと思っていない、それはしていないものの、クラスを通じて持続)

実装ファイル:第二の機能で文字列の値にアクセスしようとすると、

@synthesize righta; 

- (void) function1 { 
    righta = [NSString stringWithFormat:@"A"]; 
} 

- (IBAction)function2:(id)sender { 
    NSLog(@"righta is still %@", righta); 
} 

、私が受け取ります"EXC_BAD_ACCESS"とアプリがクラッシュします。

助けがあれば幸いです。

ありがとうございます!

答えて

2

stringWithFormatは、自動リリースされたオブジェクトを返します。あなたはそれを保持しなければなりません。文字列が保持されないように、プロパティではなくivar指示にアクセスしていることに注意してください。

self.righta = [NSString stringWithFormat:@"A"]; 

一部のプログラマーは、誤ってivarに直接アクセスするのを避けるために、別のivar名でプロパティを合成する方が好きです。

@synthesize righta = righta_; 
+0

私はすべての3つの答えに投票しましたが、これは最も完全であるという理由で授与されました。 – RanLearns

+0

あなたの答えに基づいて、私はあなたも[権利を保持する]ことができると思います。それはうまくいくはずですが、理由のプロパティが優先される理由は...不必要な保持と解放の呼び出しを排除するだけですか? – RanLearns

+1

はい、それもうまくいくでしょう。プロパティは、メモリ管理をカプセル化する定型コードを排除するので好ましい。 – albertamg

2

あなたはそうでないアクセサが使用されていない変数を割り当てるには

self.righta = [NSString stringWithFormat:@"A"]; 

を使用する必要があり、その値は保持されません。

+0

また、[self setRighta:[NSString stringWithFormat:@ "A"]]; 'どちらのメソッドも同じ効果を持ちます(あなたのために保持するセッターメソッドにアクセスする)。 –

1

変更機能1へ:

self.righta = [NSString stringWithFormat:@"A"]; 

あなたは、文字列を保持することなく、rightaのIVARに直接割り当てられました。

関連する問題