2011-06-27 34 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進入產品 - >分析並查找任何早期版本警告。 – Perception

回答

5

我有我保留一個NSString, 和唯一的地方我發佈它是在 的dealloc方法。但是,由於某種原因, 然後在程序後來當我嘗試引用它(它的長度, 具體),我得到一個崩潰,說 [CFString長度]:消息發送到 解除分配實例0xff32c50。

顯然,它不被保留,然後。

如果「保留」你的意思是「指定屬性」,你在幹什麼:

self.prop = [NSString ...]; 

或者:

prop = [NSString ...]; 

因爲前者將保留(如果屬性被聲明爲retain),而後者不會。請注意,NSString屬性通常應該聲明爲copy,但這與問題是正交的)。

如果您的代碼所寫:

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

而且你真的只releasedealloc,然後確保你的包含對象尚未釋放。這可能正在發生。或者它可能是你泄漏了字符串引用,並且在沒有保留的情況下虛假地刪除了它。

與儀器使用殭屍檢測「軌道保留/釋放事件」(或任何它被稱爲)應該表現出你的對象每月的最後一個保留/釋放事件,其中包括一個炸燬了。

+0

通過保留,我的意思是我寫了'entityParameter = [EntitySearchWindow stringByEvaluatingJavaScriptFromString:@「f();」]; [entityParameter retain];'嘗試使用樂器中的軌道保留/釋放事件。 – Mason

+0

更新:這是運行殭屍工具後的分析屏幕截圖。不知道該怎麼做。 http://i53.tinypic.com/14xl6x3.png – Mason

+0

好的,我解決了它,雖然這是一個非常糟糕的解決方案。問題是被調用了五次的方法,並且在第一次運行後,字符串由於某種原因被自動釋放。我只是在方法本身中添加了另一個保留,所以每次保留時都要另外引用它自己,然後在dealloc中釋放之前autorelease其中一個引用。 – Mason