2011-06-27 13 views
0

私は保持しているNSStringを持っていますが、私が解放する唯一の場所はdeallocメソッドです。しかし、何らかの理由で、後でプログラムの長さ(具体的にはその長さ)を参照しようとすると、[CFString length]:解放されたインスタンス0xff32c50にメッセージが送信されるというクラッシュが発生します。NSStringが保持されていても解放されています

私は明示的にプログラム内の文字列を保持します。これが起こる理由がありますか?どんな助けもありがとうございます。

文字列、entityParameterはヘッダーで宣言され、後で定義されます。 はここにあるコードの一部: entityParameter = [[EntitySearchWindow stringByEvaluatingJavaScriptFromString:@"f();"] retain];

私はクラッシュを取得しています場所は次のようになります。 if([entityParameter length] != 0 && entityParameter != nil) { return; }

+1

いくつかのコードを見ることなく、これは答えることができません。 – sbooth

+0

さて、編集されます。 – Mason

+0

可能であれば、あなたが間違っていることが分かるようにコードを投稿してください。また、XCode4を使用している場合は、Product-> Analyzeに行き、早期リリースの警告を探します。 – Perception

答えて

5

私が保持してきたNSStringの、 と唯一の場所を持っています私はそれが deallocメソッドでリリースされています。何らかの理由で、 が、 (特にその長さ、 )を参照しようとすると、 [CFString length]: に割り当てられたインスタンス0xff32c50にメッセージが送信され、クラッシュしました。

明らかに、それは保持されません。

、あなたは「プロパティに割り当てられた」意味「を保持」あなたがやっていることであれば:プロパティは次のように宣言されている場合、前者が(保持されますので

prop = [NSString ...]; 

self.prop = [NSString ...]; 

かをretain)、後者はそうではない。 NSStringプロパティは一般的にcopyと宣言する必要がありますが、それは質問とは正反対です)。

書かれたとして、あなたのコードがある場合:

entityParameter = [[EntitySearchWindow stringByEvaluatingJavaScriptFromString:@"f();"] retain]; 

そして、あなたは本当にあなたの含むオブジェクトが既に割り当て解除されていないことを確認した後、deallocにのみreleaseそれを行います。それは起こっているかもしれません。または、文字列参照をどこかに漏らし、偽りなくそれを削除せずに削除している可能性があります。

「トラック保持/解放イベント」(またはそれが呼び出されたもの)を備えた計測器でゾンビ検出を使用すると、オブジェクト上のすべての保持/解放イベントが表示されます。

+0

retainで、私は 'entityParameter = [EntitySearchWindow stringByEvaluatingJavaScriptFromString:@" f(); "]と書いたことを意味しました。 [entityParameter retain]; '楽器のトラックの保持/解放イベントの使用を試みます。 – Mason

+0

更新:ゾンビ器具を実行した後のアナリティクスのスクリーンショットです。これで何をすべきか分かりません。 http://i53.tinypic.com/14xl6x3.png – Mason

+0

さて、私はそれを解決しましたが、かなり悪い解決策です。問題はメソッドが5回呼び出されたことです。最初の実行後、文字列はなんらかの理由でオートレリースされました。メソッド自体の中に別のretainを追加したので、保持するたびに別の参照を保持してから、deallocで割り当て解除する前に参照の1つを自動解放します。 – Mason

関連する問題