2016-08-08 9 views
1

私は、Logos/Theosを使用してiOSの調整を行っています。コールの間に変数が公開される

私はユーザーがいつも入力した最後の2文字を保存する必要があります。

このための私のコードは次のとおりです。

static NSString *lastTwoChars = [[NSString alloc] init]; 
... 
if (lastTwoChars.length < 2) { 
    lastTwoChars = [lastTwoChars stringByAppendingString:text]; 
} else { 
    lastTwoChars = [lastTwoChars stringByAppendingString:text]; 
    lastTwoChars = [lastTwoChars substringFromIndex:1]; 
} 
... 

(この範囲では、textは、彼らは、キーボードで入力した最後の文字である)

私は3番目の文字を押すまでこのコードは、正常に動作します。試行錯誤の非常に長い時間の後、変数lastTwoCharsがリリースされ、別のオブジェクトになっているためです。

オブジェクトの割り当てを解除して別のオブジェクトに変更しないようにする方法を理解できません。私はretain変数にしようとしましたが、どちらかが間違っている、または動作しません。

ご協力いただければ幸いです。

+0

あなたは確かに、やる使用している方法は、新しい 'NSString'オブジェクトを返します。 ARCまたはMRCを使用していますか? – Droppy

+0

@Droppyデフォルトは何でも。私はそれを違うように設定したことはありません。 –

答えて

-1

いいえ。私はついにそれを理解した。この問題をヒントしてくれたDroppyに感謝します。

は、私は新しい文字列を保持することによって、それを修正:

if (lastTwoChars.length < 2) { 
    lastTwoChars = [[lastTwoChars stringByAppendingString:text] retain]; 
} else { 
    lastTwoChars = [[lastTwoChars stringByAppendingString:text] retain]; 
    lastTwoChars = [[lastTwoChars substringFromIndex:1] retain]; 
} 

は、私がstringByAppendingStringsubstringFromIndexが新しいNSStringオブジェクトを作成したことを知らなかった、感謝ので再びDroppyに。

編集:これはメモリリークの可能性があると思っていましたが、Droppyはそれが正しいことを確認しました。

これは私の新しいコードです:

if (lastTwoChars.length < 2) 
{ 
    lastTwoChars[lastTwoChars.length] = (unichar) text; 
} 
else 
{ 
    lastTwoChars[0] = lastTwoChars[1]; 
    lastTwoChars[1] = (unichar) text; 
} 
+0

これで今はメモリリークが発生しています...常に最後の2文字が必要な場合は、なぜstatic unichar lastTwoChars [2];を使用しないのですか? – Droppy

+0

@Droppy私はそれを考えなかった。ありがとう。私は答えを編集しました。それは正しいと思われますか? –

+0

いいえ、まったくありません。 '[text characterAtIndex:index]'が必要です。ここで 'index'を計算する必要があります。 – Droppy

関連する問題