0

我正在嘗試使用Scintilla組件的最新功能,該組件提供類似OSX的文本高亮效果(黃色動畫彈跳框),並且卡住了彈出的錯誤向上間歇:EXC_BAD_ACCESS on animationForKey:

EXC_BAD_ACCESS

指向該特定行:

if (layerFindIndicator!=nil) 
     if ([layerFindIndicator animationForKey:@"animateFound"]) 
      [layerFindIndicator removeAnimationForKey:@"animateFound"]; 

if是我的;以防萬一我發現對象layerFindIndicator爲零,或解除分配或其他...不幸的是,它並沒有幫助......)

layerFindIndicator看似是CAGradientLayer的一個子類。 (您可能會看到layerFindIndicatorhere的完整代碼)。

因爲我是一個絕對的新手石英芯,請給我任何提示,以便如何調試?

+0

我會猜測layerFindIndicator'已經'dealloc''ed了。如果聲明不會防止尚未設置爲零的釋放對象。例如尋找你釋放它的地方...... – 2012-04-22 15:22:25

+0

@ Paul.s你在這裏已經有了相當多的觀點,但是我絕對不能發現這個對象在哪裏被處理過......(這不是我的代碼,而是我的代碼片段一些新的增加,使其成爲最新的Scintilla版本,所以我很迷茫)。我現在試圖在創建對象之前(因爲它應該創建),它似乎正在工作(到目前爲止,那是...) – 2012-04-22 15:45:57

回答

5

因爲,我是一個絕對的新手到石英核心,能告訴我任何暗示爲這到底是怎麼調試?

這與QuartzCore沒有任何關係(至少我希望不是) - 它的一般this-object-has-been-killed-before-its-time-how-do-I-找到殺手的東西。

在Xcode中:

  1. 編輯你當前方案。
  2. 對於配置文件操作,將其設置爲使用調試配置。
  3. 關閉並點擊Profile命令。

Xcode將爲該操作構建並啓動儀器。

儀器會提示您選擇一個模板;你想要殭屍模板。一旦您選擇了它,Instruments將創建一個跟蹤文檔並運行您的應用程序。切換到你的應用程序(如果它不是最前面的),然後做任何事情導致崩潰。

如果崩潰確實是死對象崩潰,殭屍會顯示它。你會在樂器的時間線上得到一個標誌,例如「發送給殭屍對象0xd3c2b1a0的消息」,並且你的程序可能很快就會退出。

在那個標誌是一個小小的按鈕,看起來像這樣:➲除非它是灰色的。點擊它。

這將帶您到該對象的歷史(實際上是該地址,包括任何以前的對象或在該地址開始的其他分配)。顯示擴展詳細信息窗格(右側顯示堆棧軌跡的窗口),然後向下滾動到結尾,然後逐步向後(向上)移動,查看發佈和自動發佈,查找不是不平衡對象的分配或保留。

該解決方案將可能涉及的一個或多個:

  • 更改屬性爲strongweak而不是assign/unsafe_unretained
  • 添加屬性,你以前不強擁有對象
  • 重新構建一些東西,如果不清楚上面哪一個你需要做或者其中一個看起來像是骯髒的破解
  • 切換到ARC得到weak性能和__weak實例變量(這兩者時自動被引用的對象死亡被置到nil),並獲得局部變量被隱式初始化nil

但它會取決於你在儀器查找。而且,當然,您的問題(糟糕的訪問)有可能不是死對象,上述所有內容都無法幫助您。

-1

試試這個:

if (layerFindIndicator!=nil){ 
    if ([layerFindIndicator animationForKey:@"animateFound"]){ 
     [layerFindIndicator removeAnimationForKey:@"animateFound"]; 
    } 
} 

還要檢查,看是否被釋放它不然,。

編輯:

另一件事我發現你沒有一個空白的如果。現在您的代碼應該是這樣的:

if (layerFindIndicator != nil){ 
    if ([layerFindIndicator animationForKey:@"animateFound"]){ 
     [layerFindIndicator removeAnimationForKey:@"animateFound"]; 
    } 
} 
+1

雖然我個人會用括號重寫OP原始代碼有 - 這對功能沒有任何區別... – 2012-04-22 15:38:03

+0

哦,失敗了。我雖然是**必須** ...我想我應該重新閱讀我的Objective C書。 – Sirens 2012-04-22 15:40:51

+0

我自己通常不會這樣寫(沒有括號);我只是爲了調試而輸入(當我調試時我個人不在乎造型......):-) – 2012-04-22 15:42:00