2011-11-02 6 views
0

ていない他に障害が発生している間、なぜ1つのスニペットが動作を確認してください。forループはNSStringの完全性に影響しますか?

これが失敗した(アプリが終了します)ボタンを3回(このコードは切り取ら「ボタンを押して」上で実行される)を押した後:

sUser = [NSString stringWithFormat: @"%@ %c", sUser, charcode];//appendstring 

注:ヘッダファイルsUserはNSStringとして定義され、charcodeはintです。

これは、(このコードスニペットは、「ボタン押下」上で実行される)動作:

int r; 
theString = @""; 

for(i = 0; i < iDigits ; i++) 
{ 
    r = rand() % 26; 
    theString = [NSString stringWithFormat: @"%@ %c", theString, r + 65];//appendstring 
} 

注:ヘッダファイルtheStringにNSStringのように定義されていること。

+0

アプリがクラッシュしたときにどのようなトレースバックを取得しますか?実際の質問に答えるためには – Jim

答えて

0

SUSERはヘッダで定義されている場合、クラッシュした理由は、これはそれがあなたのクラスに属することを意味してに割り当てる必要があります保持された文字列。あなたはSUSERこの

self.sUser = [NSString stringWithFormat: @"%@ %c", sUser?:@"", charcode]; 

そう

NSString *temp = [NSString stringWithFormat: @"%@ %c", sUser?:@"", charcode]; 
[sUser release]; 
sUser = [temp retain]; 

を行うためのプロパティを持っている場合今すぐ文字列NSMutableStringを追加するためのより良い、より効率的な方法があります。

1

ループごとに別の文字列をtheStringに割り当てるとします。

int r; 
theString = [NSMutableString string]; 

for(i = 0; i < iDigits ; i++) 
{ 
    r = rand() % 26; 
    [theString appendFormat: @"%c", r + 65]; 
} 

編集:申し訳ありませんが、私はなぜ最初のスニペットを尋ねる実際の質問に答えるのを忘れて、既存の文字列を変更したい場合は、このように、代わりにNSMutableStringと-appendString:または-appendFormat:を使用するべきです動作しません。 jrturtonはここで正しい答えを持っています:あなたは文字列を保持していません。文字列はオートリリースされているので、保持しない限り解放され、割り当てが解除されます。上記のコードについても同じことが言えます。結果の文字列を保持する予定がある場合は、それを保持する必要があります。

1

最初のサンプルでは、​​ボタンをもう一度押すまでにリリースされる自動解放文字列を作成しています。 2番目のサンプルでは、​​1つのループ内のすべてを実行しています。つまり、自動解放プールが排水されません。

SUSERが保持プロパティをされた場合は、最初のサンプルがあるべき

self.sUser = [NSString stringWithFormat: @"%@ %c", sUser, charcode]; 
+0

+1。 – Caleb

関連する問題