我在iOS應用程序中遇到問題,經過一段時間後,對象沒有被釋放,因爲它應該是。我懷疑這是因爲還有一個參考。我正在使用ARC。如何找到防止在objective-c/Xcode中使用dealloc的無用參考?
我想知道創建引用的位置。然後,我將能夠告訴它應該在哪裏被置零,或者它應該被作爲弱引用。
我想象的那樣一個可能的解決方案:
如果我可以設置每一個地方的引用計數,又名保留計數,被修改的地方設置一個斷點,然後我會很快找到問題所在。我只是不知道如何設置這樣一個斷點。也許在ARC之前,這可以通過在retain
和release
內設置斷點來完成,但我不知道如何使用ARC來做到這一點。
高度簡化的例子代碼:
我在我班的一個這樣做,我知道:
// ShouldBeDeallocated.m
- (void) dealloc {
NSLog(@"%s", __FUNCTION__); // this never shows up in output
}
而且我懷疑,我前一段時間寫了這樣的代碼,但我找不到在哪裏,這是:
// UnknownSuspect.m
@interface UnknownSuspect()
@property (strong, readwrite) id referenceWhichIsNeverNeeded;
@end
- (void) someMethod:(ShouldBeDeallocated*)ref {
self.referenceWhichIsNeverNeeded = ref;
// The object pointed to by referenceWhichIsNeverNeeded will
// not be dealloc'ed unless the property gets overwritten.
}
我檢查了靜態分析器的所有警告。我也用儀器來檢查內存泄漏。大部分顯示的泄漏都會在NSMutableDictionary或malloc中說幾個字節。在那裏,我沒有發現任何與我寫的代碼有關的東西。 –
我的問題可能是http://stackoverflow.com/questions/6988911/finding-all-references-to-an-object-instance-in-obj-c的重複。 –
這個問題仍然沒有得到我完全接受的答案,但我解決了我的個人問題,通過手動閱讀我的代碼堆。通過這個手工努力,我終於找到了罪魁禍首,一個循環參考。由於某些原因,儀器不會檢測到這個循環參考,儘管它非常簡單。 –