2008-11-17 47 views
3

我正在尋找的是一種以編程方式驗證目標對象已被釋放的方法。目前我在我希望觀察的對象的dealloc方法中有一個NSLog語句。 單元測試框架來自Google的Google Toolbox,並且它工作得很好。我只是不確定如何框架這個特定的測試。單元測試驗證對象獲取釋放

回答

2

使用_GTMDevLog:

見先進的東西|單元測試記錄on this page

有關DevLogNAssert的更多信息。

+0

謝謝,_GTMDevLog正是我正在尋找的,現在想弄清楚如何在我的單元測試目標中進行設置。 – 2008-11-17 17:40:33

0

您可以在某種事件監視器服務中記錄dealloc,以便測試代碼可以查詢是否發生了dealloc。顯然,你的名字或ID記錄它,因爲對象被dealloc'd ...

0

我可能很幼稚,但不會去配的單元測試包括

  • 的分配對象,
  • 的釋放都會通過你的方法進行測試,
  • 試圖調用從對象的東西,然後
  • 捕捉異常,看看它的類型是正確的?
+0

有沒有例外 - 嘗試解除引用已經`免費`內存的指針將崩潰。 – 2008-11-18 19:18:44

1

在過去,我已經創建了一個計算已經通過增加在構造函數中的值,並在析構函數遞減它分配一個給定類的對象的數量的變量。單元測試只是在測試結束時檢查變量是否爲零。

2

你可以調整dealloc方法。見MethodSwizzling on CocoaDev;使用Leopard的新功能method_exchangeImplementations的現代方法是(當前)接近頁面的底部。

您的實現需要告訴您的測試用例對象它已被調用。一種方法是在測試用例類和替換方法都定義的文件中使用靜態變量;您的測試方法將該變量設置爲NO,然後釋放該對象,然後聲明該變量的值現在爲true。

0

我已經寫了釋放對象,如果對象得到了釋放返回YES功能:

BOOL getsDeallocatedByReleasing(id object); 

還有一個先進的界面,你可以在一個塊中運行任意代碼,你會得到一個布爾指示是否給定類的一個對象釋放:

BOOL classGetsDeallocated(Class c, void (^block)(void)); 

代碼使用方法交叉混合,它是相當醜陋,絕對不是線程安全的,但它的作品。你可以在GitHub找到它,如果我發現任何錯誤,我會保持更新。


P.S.在編寫完所有代碼後(d'噢!),是不是可以在開始時添加一個單獨的retain,做任何你想要的操作,拆下正在檢查的對象圖並檢查對象的保留數?