2013-12-18 11 views
5

Tôi có một trình đơn chính khởi chạy trình điều khiển chế độ xem với SKView/SKScene qua phân đoạn phương thức. Sau đó tôi gọi hàm dismissViewControllerAnimated, trả về ứng dụng cho menu chính, nhưng tôi vẫn có thể nghe thấy hiệu ứng âm thanh từ SKScene. Khi tôi khởi chạy lại SKScene nhiều lần, ứng dụng sẽ bị treo.Cảnh SpriteKit không được phát hành

Tôi đã thử làm theo hướng dẫn phân tích heapshot (http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/) nhưng dường như tôi không nhận được bất kỳ đâu. Tôi đã đảm bảo xử lý tất cả các @properties mạnh mẽ ...

Bất kỳ ý tưởng nào về những gì có thể gây ra sự cố này? Có bất kỳ mã/ảnh chụp màn hình nào hữu ích hay tôi có thể cung cấp bất kỳ thông tin nào để giúp thu hẹp sự cố không?

Instruments

+2

Đã bật ARC? Kiểm tra tất cả các phiên bản mạnh, bạn có lưu trữ bất kỳ phiên bản nào bên ngoài các phiên bản trình điều khiển skview/skscene hoặc sk view không? Một lỗi phổ biến khác là một chu trình lưu giữ chung đối với các cấu trúc đồ thị, ví dụ khi một nút giữ một tham chiếu mạnh mẽ đến một trong các nút cha hoặc nút anh chị em của nó (làm cho chúng yếu). – LearnCocos2D

+0

Vâng, sử dụng ARC. Re. câu hỏi thứ hai của bạn, bất kỳ lớp nào có các thể hiện mạnh mẽ đặt chúng thành không trong cả viewDidUnload hoặc dealloc, là không đủ? Tôi sẽ đi sâu vào mã để điều tra điểm cuối cùng của bạn. –

+0

Thật không may sửa chữa tất cả các chu kỳ giữ lại tôi có thể tìm thấy dường như không giúp đỡ ... –

Trả lời

0

Bạn có thể triển khai lệnh dismissViewControllerCuộc gọi phương thức theo cách sau.

[self dismissViewControllerAnimated:NO completion:^{ 
    // release the SKScene here.... 
}]; 
+0

Tôi không sử dụng bộ điều khiển điều hướng, chỉ là phương thức phân đoạn và UIViewControllers –

+0

Ok trong trường hợp đó, bạn vẫn có thể triển khai phương thức khối hoàn thành dismissViewControllerAnimate: completion và giải phóng các đối tượng trong khối. – ldindu

+0

Tại sao cần phải thực hiện điều này khi mã phát hành ở dạng viewDidUnload? –

4

Rất khó để biết được thông tin được cung cấp. Tôi có thể nói với bạn rằng tôi đã có một vấn đề tương tự và nó hóa ra có liên quan đến các đối tượng SKAction. Tôi đã cache các hành động như các thuộc tính của scene và sau đó có các nút con chạy các hành động đó. Tôi thấy rằng đảm bảo rằng các nút con được gọi là removeAllActions đã loại bỏ sự cố cho tôi. Một cái gì đó dọc theo dòng:

-(void) willMoveFromView:(SKView *)view 
{ 
    [self.children enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
     SKNode* child = obj; 
     [child removeAllActions]; 
    }]; 

    [self removeAllChildren]; 
} 

Không chắc chắn đây có phải là những gì bạn đang phải đối mặt, nhưng có thể là điều cần tìm kiếm.

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