2010-04-09 48 views
9

Ai đó có thể đăng một ví dụ về mã as3 (bao gồm cả trình nghe sự kiện), một ví dụ đơn giản về thứ gì đó có thể bị rò rỉ bộ nhớ ... hy vọng bạn có thể gửi giải pháp cho vấn đề được hiển thị không?Ví dụ rò rỉ bộ nhớ AS3

Câu hỏi đặt ra là: Ví dụ đơn giản về rò rỉ bộ nhớ trong trình xử lý sự kiện AS3 là gì và bạn có thể giải quyết nó như thế nào?

+0

Đây có phải là câu hỏi về bài tập về nhà hay không? – davr

+1

Không, nhưng tôi đã đặt nó giống như một haha ​​... Ý tưởng là có một ví dụ 'goto' tốt khi nghĩ về rò rỉ bộ nhớ nói chung. Một 'anti-pattern' tốt để nói. – Skawful

Trả lời

7
public class MySprite extends Sprite { 

    public function MySprite() { 
     if(stage) { 
      init(); 
     } else { 
      addEventListener(Event.ADDED_TO_STAGE,init); 
     } 
    } 

    private function init(e:Event = null):void { 
     stage.addEventListener(Event.RESIZE,handleStageResize); 
    } 

    private function handleStageResize(e:Event):void { 
     // do some processing here. 
    } 

} 

Một nơi nào đó khác:

var mySprite:MySprite = new MySprite(); 
someHolder.addChild(mySprite); 

Bây giờ, nếu tại một số điểm sau bạn loại bỏ mySprite, nó sẽ vẫn quẩn quanh trong bộ nhớ, bởi vì nó đã được thêm vào bản thân (hoặc một tham chiếu đến chính nó) để giai đoạn trong phương thức init().

Trong trường hợp này, cách tốt nhất để tránh điều này có thể loại bỏ trình lắng nghe được thêm vào giai đoạn khi mySprite bị xóa khỏi danh sách hiển thị.

private function init(e:Event = null):void { 
     addEventListener(Event.REMOVED_FROM_STAGE,cleanUp); 
     stage.addEventListener(Event.RESIZE,handleStageResize); 

    } 

    private function cleanUp(e:Event):void { 
     stage.removeEventListener(Event.RESIZE,handleStageResize); 
    } 

Tôi chắc chắn người khác sẽ yêu cầu bạn sử dụng các tham chiếu yếu khi thêm người nghe vào sân khấu nhưng bạn nên xóa người nghe. Nếu bạn không, khi bạn loại bỏ mySprite khỏi danh sách hiển thị và không có refs khác cho nó, sẽ đủ điều kiện cho GC và cuối cùng sẽ bị xóa khỏi bộ nhớ. Nhưng cho đến khi điều đó xảy ra, mã trong handleStageResize() sẽ tiếp tục thực thi.

+2

+1 - GC thích hợp trong flash là quan trọng, và đối với nhiều người tự học, không phải là một vấn đề rõ ràng. – Bosworth99

0

Tôi sẽ không đăng ví dụ về điều này nhưng tôi sẽ giải thích một chút. Có 2 tình huống bạn đang mô tả ở đây.

  1. rò rỉ bộ nhớ
  2. xử lý tràn

AS3 xử lý hoạt động bộ nhớ và bộ xử lý khác nhau.

Bộ nhớ Rò rỉ xảy ra khi có nhiều đối tượng được tạo và hủy. Các đối tượng rò rỉ bộ nhớ khi chúng có tham chiếu và đối tượng bị phá hủy với việc phá hủy các tham chiếu - để lại một khối bộ nhớ của một đối tượng không được sử dụng = bị rò rỉ.

Bộ xử lý tràn xảy ra khi bạn có nhiều phương pháp tham chiếu lẫn nhau với 'đóng vòng lặp'.

4

Tôi sẽ chỉ theo dõi câu trả lời của @ Juan - GC cần được xem xét từ đầu như là một khía cạnh quan trọng của thiết kế ứng dụng. Nếu bạn tạo một đối tượng, bạn phải biết mỗi tham chiếu đến nó, và loại bỏ từng tham chiếu và vô hiệu hóa nó để gắn cờ đúng cách @. Nếu bạn tham chiếu đối tượng đó trong mảng, đếm, nếu bạn tham chiếu nó trong một trình nghe, đếm, nếu bạn tham chiếu nó qua một biến cục bộ, nó cũng đếm (mặc dù chỉ trong suốt thời gian của hàm), danh sách hiển thị, điều đó chắc chắn đếm, và bật và bật.

Tôi đi xa đến mức viết câu lệnh nghe người nghe của tôi trước khi thêm chúng chỉ để đảm bảo. Tôi sẽ hầu như luôn luôn viết một phương thức hủy diệt() cho bất kỳ đối tượng nào để xử lý các hệ thống phân cấp đối tượng bên trong (các cuộc gọi cha mẹ phá hủy trên con, mà lần lượt các cuộc gọi phá hủy trên bất kỳ trẻ em nào, v.v ...). Chỉ cần loại bỏ/nulling một phụ huynh mà không làm như vậy cho mỗi đứa trẻ là quản lý GC nghèo.

Và nếu bạn thực sự có bất kỳ mối lo ngại nào về rò rỉ mem đã phát sinh, hãy theo dõi Hệ thống.totalMemory chỉ để đảm bảo:

var mem:String = Number(System.totalMemory/1024/1024).toFixed(2) + ‘Mb’; 
trace(mem); // eg traces “24.94Mb” 

Chủ yếu - chỉ là phương pháp về nó - khoa học không tên lửa của nó, nhưng bạn phải cẩn thận.

Cheers -

@ và thậm chí nếu bạn làm thế, đèn flash chiếm tâm trí riêng của mình về việc khi nào thực sự làm một quá trình quét. Điều tốt nhất chúng ta có thể làm là đảm bảo một đối tượng được gắn cờ đúng cách và tin tưởng rằng đối tượng đó sẽ được xử lý hiệu quả.