Xem Advanced Memory Management bởi Mark Probst và Rodrigo Kumpera, tôi đã học các kỹ thuật mới như lược tả Mono GC và sử dụng WeakReference
.Làm cách nào để sửa chu kỳ GC do trình xử lý sự kiện lambda gây ra?
Tuy nhiên, tôi vẫn không hiểu làm thế nào để “sửa chữa” các Puzzle 2 từ phút 28:
public class CustomButton : UIButton {
public CustomButton() { }
}
public class Puzzle2Controller : UIViewController
{
public override void ViewDidLoad()
{
var button = new CustomButton();
View.Add (button);
button.TouchUpInside += (sender, e) =>
this.RemoveFromParentViewController();
}
}
Bộ điều khiển giữ một ref để nút chứa một ref để xử lý sự kiện chứa một ref đến điều khiển.
Một cách để phá vỡ chu trình sẽ là vô hiệu hóa nút. Một cách khác là tách trình xử lý (nhưng chúng ta phải từ bỏ việc sử dụng lamdas).
Có cách nào khác/thanh lịch hơn/cách phá vỡ chu trình không? Chúng tôi có thể bằng cách nào đó dính WeakReference
vào đây không?
Cảm ơn.
Chỉnh sửa: Trong trường hợp này, nút này thậm chí không phải là trường. Nhưng vẫn còn một chu kỳ, phải không? Nó nằm trong phần xem của View's Controller. Chúng ta có phải xóa chúng không? Tôi bối rối.
Hi, nhờ trả lời. Điều này chắc chắn sẽ là một lựa chọn, nhưng tiếc là 'UIView' s không giữ tham chiếu đến bộ điều khiển của họ. Nếu sự hiểu biết của tôi là chính xác, các chu kỳ trong MonoTouch * là * một vấn đề bởi vì các đối tượng ObjC gốc dưới mui xe sử dụng tính tham chiếu. (Xem 21:30) –
@DanAbramov trong trường hợp đó, xem chỉnh sửa –
Cảm ơn bạn! Điều này hoàn toàn có ý nghĩa. –