5

tôi thêm một CAKeyframeAnimation đến lớp của một ImageView cho đại diện cho hình ảnh động của một hình ảnh:Loại bỏ CAKeyframeAnimation không giải phóng bộ nhớ

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"]; 
animation.values = arrayOfImages; 
[animation setRemovedOnCompletion:YES]; 
animation.delegate = self; 
[animation setValue:delegate forKey:@"AnimatedImageViewDelegate"]; 
animation.repeatCount = repeatCount; 
animation.fillMode = kCAFillModeForwards; 
animation.calculationMode = kCAAnimationDiscrete; 
[animation setValue:animationName forKey:@"name"]; 

Khi tôi muốn bắt đầu các hoạt hình tôi gọi:

animation.duration = duration; 
[self.layer addAnimation:animation forKey:animationName]; 
[self.layer setContents:[animation.values lastObject]]; 

Khi hoạt ảnh kết thúc, tôi muốn xóa hoàn toàn nó và giải phóng bộ nhớ của nó.

[self.layer removeAllAnimations];  
[self.layer removeAnimationForKey:animationName]; 

Thực hiện việc này và sử dụng Thiết bị giám sát hoạt động, bộ nhớ sẽ không bị xóa trừ khi tôi phát hành hình ảnh hoàn chỉnh.

Làm cách nào để phát hành bộ nhớ hoạt ảnh đó mà không hủy UIImageView ???

+0

bạn có thể thử mang nó vào autoreleasepool – SAKrisT

Trả lời

0

Bạn đang sử dụng phương pháp tiện lợi để khởi tạo đối tượng. Vì vậy, bạn sẽ không có quyền kiểm soát đối tượng khi thực sự được phát hành. Để có thể kiểm soát đó, bạn sẽ cần phải alloc đối tượng và dealloc nó tự hỏi:

Tạo dụ:

CAKeyframeAnimation *animation = [[CAKeyframeAnimation alloc] init]; 

Sau đó, sau khi hình ảnh động kết thúc cuộc gọi sau khi dây chuyền loại bỏ của bạn:

[animation release]; 
+0

'[CAKeyframeAnimation animationWithKeyPath:]' trả về một đối tượng tự động (theo quy ước đặt tên) và anh ta dường như không giữ lại nó (ít nhất anh ta không làm điều đó trong mã mà anh ta trình bày) nên anh ta sẽ ổn thôi. Làm 'alloc/release' thay vào đó sẽ không thay đổi điều đó. Thật vậy, từ mã của anh ta, tôi muốn nói mọi thứ đều tuyệt đối nên vấn đề phải ở nơi khác. – DarkDust

+0

Đúng, ngoại trừ, anh ta không có quyền kiểm soát khi nó được phát hành khi nó được tự động phát hành. Có vẻ như nó đang được tự động phát hành khi khung cảnh bị phá hủy, vì vậy có vẻ như ít nhất một cái gì đó đáng để thử. –

+0

Ngay cả khi thực hiện phân bổ hoạt ảnh/init và phát hành, bộ nhớ không giảm khi tôi sử dụng Trình giám sát hoạt động. Vì vậy, không có sự khác biệt về bộ nhớ sử dụng tự động phát hành hoặc phát hành. Nếu tôi nhận xét dòng animation.values ​​= arrayOfImages; hoạt ảnh không được hiển thị và bộ nhớ không tăng lên, do đó, vấn đề của tôi là khi hoạt ảnh kết thúc bộ nhớ không được giải phóng trừ khi tôi phát hành ImageView. – nano

0

Trước hết, nếu đây là dự án của iOS 5, ARC sẽ xử lý các bản phát hành của bạn cho bạn - điều này thật sự rất hay!

Hiện tại - Tôi đã sử dụng rất nhiều hoạt ảnh trong dự án của mình và nhận thấy các cụm tương tự trong heap. Tôi đoán là CA lưu trữ rất nhiều nội dung hoạt hình trong nội bộ. Để xác nhận những mục này thực sự được tự động phát hành, tôi khuyên bạn nên thiết lập kiểm tra phân bổ hoặc rò rỉ bằng công cụ dụng cụ và thực hiện như sau:

  1. Xác định tình huống bạn kích hoạt và hoạt ảnh.
  2. Đánh dấu đống sau khi hoạt ảnh hoàn tất.
  3. Kích hoạt nội dung nào đó sẽ đưa bạn đến chế độ xem khác, nơi các đối tượng cần được xóa.
  4. Lặp lại quy trình trong các bước 1-2-3 bao nhiêu lần tùy thích. Tôi thường làm điều đó khoảng 10 lần.

Đó là .. về cơ bản animate - mark - undo - animate - mark. Bạn sẽ thấy các heapshots giảm xuống 0 hoặc gần như 0 nếu CoreAnimation là các đối tượng autoreleasing chính xác!

Để biết thêm về làm thế nào để kiểm tra như thế này hãy xem bài viết này:

http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/

+0

Cảm ơn câu trả lời của bạn. Nó giảm xuống gần 0 khi hoạt ảnh kết thúc nhưng chỉ khi tôi phát hành ImageView. Nếu không phát hành nó, sự tăng trưởng heap là khá cao (từ 40KB đến 800KB mỗi lần). Điều đó có nghĩa là CoreAnimation không được phát hành khi nó kết thúc. – nano

0

Tôi có cùng một vấn đề về bộ nhớ với CAKeyframeAnimation khi thiết lập các giá trị = mảng của hình ảnh. Và tôi thấy rằng vấn đề tôi nhận được là các hình ảnh được inited bởi [UIImage imagewithname:] được lưu vào bộ nhớ theo mặc định. Vì vậy, giải pháp của tôi là thay đổi để sử dụng [UIImage imageWithContentsOfFile:] Hy vọng điều này hữu ích.

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