2010-09-09 26 views
6

Thỉnh thoảng trong điều kiện thiếu bộ nhớ, UIImagePickerController mà tôi sử dụng bị 'kẹt' khi đóng cửa trập. Nói chung khi WatchDog này là allready jettisoning ứng dụng nền khác vì vậy trong vòng một hoặc hai điều kiện bộ nhớ thấp là hơn, nhưng bộ điều khiển UIImagePicker vẫn còn bị mắc kẹt.UIImagePickerController ở chế độ máy ảnh bị 'kẹt' với màn trập đóng

Có bất kỳ ai khác gặp phải điều này và triển khai bất kỳ cách giải quyết nào hoặc tìm cách phát hiện khi người chọn ở trạng thái này, để nó có thể bị xóa và vị trí mới được đặt vào vị trí của nó.

Suy nghĩ/Ý tưởng/Giải pháp ??

Trả lời

2

Bạn đã thử phân bổ (và sau đó giải phóng) một megabyte hoặc hai bộ nhớ bằng cách sử dụng malloc() trước khi bắt đầu UIImagePicker? Hoặc yêu cầu sớm hơn một chút trong ứng dụng của bạn và sau đó phát hành nó khi bạn muốn hiển thị bộ chọn.

Tôi đoán bạn sẽ có thể thấy số lượng bộ nhớ mà UIImagePicker cần chạy thành công bằng cách chạy ứng dụng của bạn bên trong các công cụ.

Trong khi không lý tưởng, nó sẽ khiến các ứng dụng khác được cảnh báo bộ nhớ trước đó và do đó UIImagePicker nên có đủ bộ nhớ để chạy.

+0

Nếu bạn sử dụng NSTimer lặp lại để lên lịch một loạt các mallocs trong các khối kích thước phân đoạn trong vài mili giây, nó sẽ cho phép nhiều thời gian hơn cho các cảnh báo bộ nhớ để dọn sạch việc sử dụng bộ nhớ của bất kỳ ứng dụng nền nào khác. Sau đó giải phóng tất cả điều này ngay trước khi gọi bộ chọn hình ảnh. – hotpaw2

+0

@ hotpaw2: Vâng, đó có lẽ là một ý tưởng hay, cảm ơn! Tôi nghĩ rằng tôi đã thực hiện các khối khá lớn (và có lẽ không nhỏ hơn khối UIImagePicker lớn nhất yêu cầu), vì có một nguy cơ giới thiệu phân mảnh vào heap của ứng dụng khác. – JosephH

+0

Tôi đã chơi xung quanh với điều đó một chút. Strangley đủ, chỉ cần làm một phân bổ –

0

Đó cũng là hành vi đã biết của ứng dụng máy ảnh. Tôi đoán bạn không thể làm bất cứ điều gì với nó ngoại trừ giải phóng bộ nhớ nhiều như bạn có thể trước khi bắt đầu nó. Bạn có thể nâng cấp bộ nhớCảnh báo để mọi ứng dụng sẽ nhận được nó và bắt đầu giải phóng bộ nhớ nhưng tôi không biết làm cách nào để có thể làm điều đó. Tôi bắt đầu điều tra việc gửi thông báo (UIApplicationDidReceiveMemoryWarningNotification) mà không thành công. Tôi đoán chúng ta cần gửi một đối tượng dọc theo thông báo để xác định mức độ cảnh báo nhưng tôi thực sự không chắc chắn.

+0

Bạn không thể tự nâng cao thông báo cảnh báo hệ thống - 'UIApplicationDidReceiveMemoryWarningNotification' là thông báo chỉ dành cho ứng dụng của bạn. – rpetrich

+0

@rpetrich: Cảm ơn bạn! – VdesmedT

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