2011-11-23 57 views
12

Tôi có đoạn mã sau mà tôi sử dụng để chia tỷ lệ hình ảnh. Đây là trong một vòng lặp tạo ra và thoát ra một hồ bơi autorelease cho mỗi vượt qua. Mã này hoạt động tốt trong trình mô phỏng trong iOS5.0, trong iOS4.3 trên iPad hoặc trình mô phỏng, nhưng trên iOS5.0.1 trên iPad1, sau khi vượt qua 50-60, drawInRect bắt đầu tiêu thụ bộ nhớ không bao giờ được phát hành. Tôi đã gọi điều này từ một chuỗi thứ cấp, nhưng bây giờ gọi các hoạt động mở rộng quy mô trên luồng chính.Rò rỉ bộ nhớ drawInRect trên iOS5.0.1

UIGraphicsBeginImageContext(newSize); 
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; 
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Tôi có làm gì sai hoặc đây có phải là lỗi iOS5.0.1 không?

Cập nhật: Tôi đã thử nhiều thử nghiệm. Tôi đã có thể chứng minh rằng chính xác cùng một mã được biên dịch với XCode 4.0 chạy tốt trên cùng một iPad. Cùng một mã được biên dịch với XCode 4.2.1 gây ra một điều kiện hết bộ nhớ. Quy trình mở rộng quy mô này đang được gọi trong một chuỗi nền. Tôi đã viết một quy trình chia tỷ lệ khác nhau bằng cách sử dụng các cuộc gọi đồ họa lõi cấp thấp hơn. Nó không bị rò rỉ với XCode 4.0 nhưng bị rò rỉ khi trong ứng dụng của tôi với XCode 4.2.1. Chính xác cùng một cây định kỳ và cây gọi chạy trong một dự án độc lập không xuất hiện để rò rỉ (nhiều) bộ nhớ trên XCode 4.2.1. Tôi đang chờ đợi để nghe từ Apple về điều này. Trong thời gian đó tôi cần phải sử dụng XCode 4. Hình ảnh cài đặt duy nhất tôi yêu cầu Snow Leopard có nghĩa là tôi đang sử dụng máy cũ 5,5 năm tuổi của mình. Cảm ơn

Cập nhật 1/2012 Điều này dường như chỉ xảy ra nếu ứng dụng được bắt đầu từ bên trong XCode. Cùng một thực thi bắt đầu trên iPad không có triển lãm rò rỉ. Một ứng dụng khác với cùng một thói quen không thể hiện sự rò rỉ.

Tôi đã mở một báo cáo lỗi với Apple và đã gửi cho họ dự án tái tạo sự cố. Tôi không mong đợi nó sẽ sớm được giải quyết, nhưng nó dường như không phổ biến như tôi nghĩ ban đầu.

Cập nhật 6/2012 Mặc dù đã gửi cho Apple một dự án tối thiểu tái tạo vấn đề, họ tuyên bố không thể tái tạo vấn đề và không thực hiện bất kỳ tiến trình nào.

+0

Dường như tôi đặt các câu hỏi khó với một vài câu trả lời thực sự giải quyết được vấn đề. Chẳng hạn như cái này. Nó thực sự có thể là một lỗi biên dịch w các thư viện trong XCode 4.2. Mã tương tự này được biên dịch với SDK cho iOS 4.2 không có rò rỉ bộ nhớ trên iPad chạy iOS5.0.1. – David

+0

bạn đã bao giờ tìm thấy giải pháp cho vấn đề này chưa? – vondip

+1

Sự rò rỉ mà tôi gặp phải chỉ xảy ra khi ứng dụng được bắt đầu thông qua XCode. Khi bắt đầu bình thường trên iPad, nó không bị rò rỉ. Người dùng đã báo cáo một vụ tai nạn nghe như thế này gây ra nó, nhưng tôi nghĩ rằng cả hai đều không liên quan. Tôi lãng phí một tháng hoảng sợ cố gắng giải quyết. Tôi đã mở một báo cáo lỗi, nhưng chưa bao giờ nhận được phản hồi hữu ích. Họ tuyên bố họ không thể tái tạo, nhưng họ không cố gắng hoặc không hiểu. Tôi đã gửi một dự án tầm thường minh họa rõ ràng vấn đề. – David

Trả lời

4

Tôi tin rằng cuối cùng tôi đã tìm thấy nguyên nhân gây ra rò rỉ bộ nhớ. Tôi phát hiện ra hành vi tương tự khi thực hiện một số chèn Dữ liệu cốt lõi. Looping, tạo ra nhiều đối tượng được phát hành. Khi chạy trên iPad, mức sử dụng bộ nhớ tăng lên mặc dù không có rò rỉ hiển nhiên cho đến khi ứng dụng gặp sự cố trong bộ nhớ. Nhưng khi bắt đầu từ thiết bị, nó chạy mà không có vấn đề gì.

Nó xảy ra với tôi rằng một cái gì đó của nó về cách thức của nó được bắt đầu từ Xcode. Phải là cài đặt gỡ lỗi trong dự án.

Tắt vấn đề là do có NSZombieEnabled trong khi gỡ lỗi. Để tắt cài đặt này trong Xcode 4, nhấp chuột phải vào các lược đồ, tức là ứng dụng> targetDevice, chỉnh sửa lược đồ, chọn hành động Gỡ lỗi, tab đối số. Để bật NSZombieEnabled, biến môi trường được tạo với tên đó có giá trị CÓ và biến được bật.Để tắt tính năng này, hãy bỏ chọn hộp kiểm.

NSZombieEnabled được sử dụng để xác định xem bạn có cố phát hành một đối tượng đã được phát hành không. Để làm điều này, môi trường đang theo dõi tất cả các đối tượng được phát hành. Đây là bộ nhớ tiêu thụ xuất hiện như một rò rỉ bộ nhớ.

Khi tôi tắt tính năng này, ứng dụng của tôi đã sử dụng để phát triển nhanh hơn 115MB trước khi bị giết trên iPad1 bây giờ vui vẻ ngồi ở 24MB mà không bị rò rỉ bộ nhớ.

+0

Hmm ... Tôi có cùng mã như bạn và đang nhận được một lượng lớn rò rỉ bộ nhớ (điều này làm hỏng ứng dụng), nhưng thây ma đã tắt cho tôi. .. Bạn là chính xác mặc dù, khi tôi khởi động các ứng dụng bằng tay, không có vấn đề ... nhưng nếu tôi khởi động nó với Xcode ... CRASH CRASH CRASH! :( –

+0

Cùng một vấn đề đã xảy ra với tôi, tôi đang sử dụng xCode 5, NSZombieEnabled không được chọn. – codingrhythm

2

Mã bạn đã đăng không được gây ra rò rỉ. Rò rỉ chắc chắn là ở một nơi khác.

Tôi muốn giới thiệu hai bước sau:

  1. bài mã bạn đang sử dụng để quản lý các hồ bơi autorelease.
  2. Đảm bảo bạn đang thực hiện các dòng mã này trong chuỗi chính (Apple's documentation cho biết rằng điều này thực tế quan trọng).
+0

Nó không phải là chủ đề an toàn tho – hooleyhoop