2014-02-09 46 views
0

我有一個NSDragOperation,它在用戶將其拖入窗口時獲取屬性列表路徑。這似乎工作得很好,我可以路徑信息保存到一個NSString:NSString被破壞,對NSPrincipalClass的更改

NString *thisPath = draggedFilePath; 
NSLog(@" %@",thisPath); 
output: 2014-02-09 09:19:46.072 app[5944:303] /Users/Me/Desktop/file.plist 

的問題,當我進入調度隊列開始。當我嘗試從背景隊列中讀取NSString時,輸出變爲NSPrincipalClass。有誰知道爲什麼會發生這種情況,或者如果我在輸入dispatch_queue_t之前將NSString轉換爲其他格式?

dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(backgroundQueue, ^{ 

    for (NSUInteger i = 0; i < 1; i++) { 

     dispatch_async(dispatch_get_main_queue(), ^{ 

     }); 
    } 

    NSLog(@" %@",thisPath); 
output: 2014-02-09 09:19:56.234 app[5944:12203] NSPrincipalClass 

編輯:使用的NSLog調度隊列內的串的輸出變成了隨機的符號,並也崩潰。最後的輸出是<__NSMallocBlock__: 0x55a860> - 我有其他的字符串在同一個函數中似乎很好,所以我真的不知道是什麼造成了這種情況。

+0

請嘗試製作字符串的副本。 –

回答

-1

如果用'__block'作爲thisPath的聲明的前綴,它會起作用嗎?就像這樣:

__block NString *thisPath = draggedFilePath; 
+0

當我使用'__block'應用程序崩潰時試圖nslog調度隊列。 'libobjc.A.dylib objc_msgSend_vtable5:''EXC_BAD_ACCESS(code = 1,address = 0x18)' – ctfd

+0

這很奇怪 - 我幾乎想說NSLog本身與它崩潰有關。 – ctfd

+0

如果你保留字符串呢? – user1118321

1

三種情況之一發生的事情......

  1. 它被釋放,以及一個新的對象是在它的位置被分配......你可以試試殭屍...
  2. 它正在被分配到垃圾值,即。 draggedFilePath不會初始化爲零,並且沒有設置好值。
  3. 你的堆棧正在被砸碎,它恰好在它發生崩潰時發生......這是最難找到的。

你將不得不打開殭屍,異常斷點,並在調試器中單步穿過它......如果失敗,你可以使用malloc工具在儀器中運行或打開malloc歷史日誌記錄。

+0

嗨,謝謝你的回答。你提到的是有道理的。我有幾個問題:什麼是將draggedFilePath初始化爲零的最佳方式;關於殭屍 - 如果你能指向我可能有用的東西,那將會很棒,因爲我不熟悉。 – ctfd

+0

@ user3257552我將不得不看到更多的代碼 –