Có, theo những gì bạn đã cung cấp, bạn bị rò rỉ bộ nhớ. Khi bạn tìm thấy chuỗi tham chiếu, và nó không có trong mã của bạn, cách dễ nhất để đi là ... Reflector.
Hình ảnh cho biết: JournalEntryKeepAlive._keepAliveRoot
trường chứa tham chiếu đến đối tượng. Chúng ta hãy đi vào Reflector và xem làm thế nào anh chàng này được nối với đối tượng của chúng tôi.
Lần này thật dễ dàng và tất cả các dấu vết đều dẫn đến chức năng NavigationService.MakeJournalEntry()
và sau đó đến NavigationService.IsContentKeepAlive()
. Dưới đây là:
internal bool IsContentKeepAlive()
{
bool keepAlive = true;
DependencyObject dependencyObject = this._bp as DependencyObject;
if (dependencyObject != null)
{
keepAlive = JournalEntry.GetKeepAlive(dependencyObject);
if (!keepAlive)
{
PageFunctionBase base2 = dependencyObject as PageFunctionBase;
bool flag2 = !this.CanReloadFromUri;
if ((base2 == null) && flag2)
{
keepAlive = true;
}
}
}
return keepAlive;
}
Bây giờ bạn đã biết quy tắc. Đối tượng được lưu trong bộ nhớ nếu:
- Nó không phải là đối tượng phụ thuộc;
- Được đính kèm thích hợp JournalEntry.KeepAlive là đúng;
- Nó không phải là một PageFunction và nó không thể được tải lại từ Uri.
Sau khi điều tra này có thể đáng đọc hơn về tài sản JournalEntry.KeepAlive trên MSDN.
Chiến lược này đã giúp tôi tìm thấy nhiều loại côn trùng liên quan đến bộ nhớ. Mong nó cũng giúp được cho bạn :).
PS: Nếu bạn tiếp tục gặp sự cố khi tìm thấy lỗ hổng cụ thể này, bạn có thể dán mẫu mã tối thiểu để chúng tôi sao chép và cung cấp cho bạn câu trả lời đúng hơn.
Chúc mừng, Anvaka
Cảm ơn bạn đã giải thích chi tiết, nhưng tôi không chắc chắn tôi làm theo phần DependencyProperty. Nếu tôi đã đặt KeepAlive là sai trên mọi trang, tại sao nó vẫn được giữ trong bộ nhớ? – Brandon
Thực hiện theo đường dẫn logic: ngay cả khi bạn đặt KeepAlive = false trên mỗi trang, bạn vẫn có thể nhận được true từ IsContentKeepAlive() khi flag2 là true, có nội dung:! CanReloadFromUri – Anvaka
Ah, right. Cảm ơn câu trả lời tuyệt vời. – Brandon