Tôi có một bộ nhãn được đặt trong một bộ UIViews
bên trong một UIScrollView
. Họ chưa được chỉ định một lối thoát. Tôi đang sử dụng phông chữ Avenir Next Ultralight cho tất cả chúng, và chúng có kích thước khác nhau.Phân bổ nhãn không cố định và chiếm 8Mb bộ nhớ
Chế độ xem chính có bộ điều khiển chế độ xem đơn được lồng trong bộ điều khiển điều hướng.
Tôi chỉ chạy qua kiểm tra phân bổ và nhận thấy rằng với chế độ xem đơn này khi tải tiêu thụ khoảng 10MB bộ nhớ trong đó 8MB là các nhãn này và khi tôi chuyển sang chế độ xem tiếp theo, phân bổ đó vẫn hoạt động.
Điều gì có thể gây ra điều này?
Đây là ảnh chụp nhanh từ phân bổ ghi âm.
Snapshot Timestamp Growth # Persistent
VM: UILabel (CALayer) 7.90 MB 10
0x5417000 00:02.950.428 1.23 MB
0x5553000 00:02.967.675 1.23 MB
0x568f000 00:02.978.283 1.23 MB
0x591d000 00:03.013.095 832.00 KB
0x57cb000 00:03.004.334 832.00 KB
0x50a7000 00:02.919.040 832.00 KB
0x5177000 00:02.937.076 832.00 KB
0x5347000 00:02.940.969 832.00 KB
0x52d3000 00:02.998.823 120.00 KB
0x52f1000 00:03.023.068 16.00 KB
Đây là stack trace cho người đầu tiên, và phần còn lại đều giống nhau:
0 libsystem_kernel.dylib mach_vm_allocate
1 libsystem_kernel.dylib vm_allocate
2 QuartzCore CA::Render::Shmem::new_shmem(unsigned long)
3 QuartzCore CA::Render::Shmem::new_bitmap(unsigned int, unsigned int, unsigned int, unsigned int)
4 QuartzCore CABackingStoreUpdate_
5 QuartzCore ___ZN2CA5Layer8display_Ev_block_invoke
6 QuartzCore x_blame_allocations
7 QuartzCore CA::Layer::display_()
8 QuartzCore CA::Layer::display_if_needed(CA::Transaction*)
9 QuartzCore CA::Layer::layout_and_display_if_needed(CA::Transaction*)
10 QuartzCore CA::Context::commit_transaction(CA::Transaction*)
11 QuartzCore CA::Transaction::commit()
12 UIKit -[UIApplication _reportAppLaunchFinished]
13 UIKit -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:]
14 UIKit -[UIApplication handleEvent:withNewEvent:]
15 UIKit -[UIApplication sendEvent:]
16 UIKit _UIApplicationHandleEvent
17 GraphicsServices _PurpleEventCallback
18 GraphicsServices PurpleEventCallback
19 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__
20 CoreFoundation __CFRunLoopDoSource1
21 CoreFoundation __CFRunLoopRun
22 CoreFoundation CFRunLoopRunSpecific
23 CoreFoundation CFRunLoopRunInMode
24 UIKit -[UIApplication _run]
25 UIKit UIApplicationMain
26 main
27 libdyld.dylib start
SOLUTION
Nghĩ rằng tôi sẽ chia sẻ làm thế nào tôi quản lý để giảm này. Nó chỉ ra rằng nếu bạn có nhãn mà bọc từ, và có một số lượng đáng kể không gian trống xung quanh hai bên, và trên và dưới, điều này thêm vào bộ nhớ cần thiết để hiển thị chúng. Vì vậy, giải pháp là giảm không gian đó xuống mức tối thiểu tuyệt đối.
Dưới đây là ảnh chụp kết quả:
Snapshot Timestamp Growth # Persistent
VM: UILabel (CALayer) 2.37 MB 9
0x00 00:02.503.255 208.00 KB
0x5248000 00:02.474.045 392.00 KB
0x5087000 00:02.432.317 208.00 KB
0x50bb000 00:02.445.927 64.00 KB
0x5303000 00:02.498.137 120.00 KB
0x52aa000 00:02.481.354 292.00 KB
0x50cb000 00:02.449.625 180.00 KB
0x5355000 00:02.505.638 112.00 KB
0x50f9000 00:02.455.350 848.00 KB
Chi phí này không đánh tôi quá mức. Bạn có thể thực hiện một thử nghiệm không có nhãn không? - Ngoài ra, có phải các nhãn được tạo ra thông qua bảng phân cảnh không? – Mundi
Tôi đã thử nghiệm và sử dụng bộ nhớ ít hơn 8Mb. Có, thông qua các nhãn được khởi tạo qua bảng phân cảnh. Tôi đã thực hiện một thử nghiệm khác bằng cách giảm kích thước của mỗi nhãn để loại bỏ các khu vực nơi nhãn trống. Làm điều đó chỉ với hai nhãn được quản lý để giảm nó xuống 1,5Mb. – user2916031
Vì vậy, hóa ra đó là vấn đề. Không gian trống trong các nhãn đã tăng đáng kể yêu cầu bộ nhớ. Tôi đã quản lý để có được các nhãn xuống 2.4Mb. – user2916031