2013-11-20 22 views
5

Vì vậy, tôi có một đối tượng CCLayer trong đó có một đối tượng CCSprite đứa trẻ, khi một điều kiện xảy ra (phát hiện bằng một phương pháp cập nhật) một phương pháp của CCSprite được gọi mà tự nó gọi sauobj-c NSNotificationCenter Truy cập Bad

[[NSNotificationCenter defaultCenter] postNotificationName:@"mymethod" object:nil]; 

các CCLayer sau đó tiếp tục chạy

[node removeFromParentAndCleanup:YES]; 

cho CCSprite để xoá bỏ nó. CCLayer cũng được gọi là sau đây trên init

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mymethod) name:@"mymethod" object:nil]; 

Bây giờ 9 lần trong số 10 điều này là tốt và hoạt động như mong đợi tuy nhiên đôi khi tôi nhận được một bad_access trỏ đến dòng thông báo.

Đoán của tôi khi đọc về những người khác có tương tự vấn đề là vì đối tượng con đã bị xóa, nhưng tôi không biết làm cách nào khác để gọi nó trước khi bị xóa.

Có thể có điều gì đó đang xảy ra để trì hoãn thông báo bài đăng đang được gọi và nó kết thúc được gọi sau khi đối tượng bị xóa hoặc tôi đang sủa nhầm cây?

CẬP NHẬT

Cho code loại bỏ trên, nếu tôi nhận xét ra phương thức remove và dọn dẹp đường nó không xảy ra.

+2

bạn có thể đăng mã nơi bạn xóa con không? –

+0

bạn có thể muốn đăng trong phương thức onExit, nếu lớp cha cuối cùng là một lớp cocos2d. onExit được gọi trong chu trình 'removeFromParent' và được thực hiện trước khi loại bỏ thực tế. Đừng quên [super onExit]. – YvesLeBorg

+0

Bạn đã cố gắng loại bỏ đối tượng, chỉ để xem liệu nó có còn xảy ra không? – AntonijoDev

Trả lời

5

Bạn cần xóa người quan sát. Các nhà quan sát không bị xóa tự động, vì vậy nếu bạn không xóa chúng thì bạn sẽ xếp chúng vào bộ nhớ, đó có thể là lý do khiến nó bị hỏng sau này.

+0

Cảm ơn tuyệt vời, tôi đã thêm phần sau vào phương thức dealloc của tôi '[[NSNotificationCenter defaultCenter] removeObserver: self];' Tôi sẽ thử nghiệm nó. –

+0

ok hy vọng Nó hoạt động – AntonijoDev

+0

Vâng có vẻ tốt với tôi, không thể sản xuất các lỗi nữa. Cảm ơn! –

Các vấn đề liên quan