2010-05-06 39 views
23

Tôi biết tôi có thể mô phỏng cảnh báo bộ nhớ trên trình mô phỏng bằng cách chọn 'Mô phỏng Cảnh báo bộ nhớ' từ trình đơn thả xuống của Trình mô phỏng iPhone. Tôi thậm chí có thể tạo ra một phím nóng cho điều đó.Mô phỏng cảnh báo bộ nhớ từ mã, có thể?

Nhưng đây không phải là điều tôi muốn đạt được. Tôi muốn làm điều đó từ mã một cách đơn giản, cho phép nói cứ làm 5 giây một lần. Điều đó có thể không?

Trả lời

55

Nó thực sự khá dễ dàng, tuy nhiên nó dựa trên một cuộc gọi api không có giấy tờ, do đó, không gửi ứng dụng của bạn với nó (ngay cả khi nó là một con đường mã không thể tiếp cận). Tất cả bạn phải làm là: [[UIApplication sharedApplication] _performMemoryWarning];

Phương pháp này sẽ có đối tượng UIApplication của App đăng UIApplicationDidReceiveMemoryWarningNotification và gọi applicationDidReceiveMEmoryWarning: Phương pháp trên App đại biểu và tất cả của UIViewController

-(IBAction) performFakeMemoryWarning { 
    #ifdef DEBUG_BUILD 
    SEL memoryWarningSel = @selector(_performMemoryWarning); 
    if ([[UIApplication sharedApplication] respondsToSelector:memoryWarningSel]) { 
     [[UIApplication sharedApplication] performSelector:memoryWarningSel]; 
    }else { 
     NSLog(@"Whoops UIApplication no loger responds to -_performMemoryWarning"); 
    } 
    #else 
    NSLog(@"Warning: performFakeMemoryWarning called on a non debug build"); 
    #endif 
} 
+1

+1. Câu trả lời hay. –

+0

Đáng buồn thay điều này không làm việc cho tôi trên 4,2, các respondsToSelector có điều kiện giải quyết đúng và chọn được thực hiện nhưng không có gì xảy ra. – Shizam

+0

Vẫn làm việc cho tôi trên 4.3 (mặc dù tôi không bận tâm với respondsToSelector). – smparkes

1

Chỉ cần alloc-init các đối tượng lớn trong một vòng lặp và không bao giờ giải phóng chúng. Điều đó sẽ kích hoạt cảnh báo bộ nhớ khá nhanh, tôi sẽ tưởng tượng.

+1

Vâng đó là một giải pháp khác, nhưng tôi đang tìm cách chuyên nghiệp hơn để thực hiện. Ppl quyết định thực hiện theo cách đó cũng phải ghi nhớ để phân bổ các đối tượng trong các luồng khác nhau, gây ra nó trong trình đơn chính sẽ đơn giản là giết ứng dụng (vì nó sẽ không quay trở lại vòng lặp chính). – krasnyk

+3

Chỉ cần phân bổ bộ nhớ không làm điều đó, bạn thực sự phải ghi vào bộ nhớ mà bạn đã cấp phát. Tôi đã viết một ứng dụng để thử điều này và phát hiện ra rằng sau khi phân bổ 300MB trên một 3GS và nó vẫn đang diễn ra. – progrmr

+0

Bạn có 'init' đối tượng' alloc'-ed object không? Điều này thường liên quan đến việc ghi vào bộ nhớ, thiết lập các giá trị mặc định của các thuộc tính, vv –

4

Đăng một UIApplicationDidReceiveMemoryWarningNotification thông báo mặc định trung tâm thông báo:

[[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidReceiveMemoryWarningNotification object:nil] 
+1

Điều này sẽ không hoạt động giống như cảnh báo bộ nhớ được kích hoạt trên trình giả lập với Phần cứng-> Mô phỏng Cảnh báo bộ nhớ. Sự khác biệt là gì? Mã của bạn sẽ chỉ đăng thông báo để bất cứ khi nào bạn nghe thông báo này, tất nhiên bạn sẽ nhận được thông báo, nhưng tất cả các phương thức -didReceiveMemoryWarning của viewControllers và như vậy sẽ không được gọi khi giải pháp của bạn được sử dụng. – krasnyk

+7

sẽ không hoạt động chính xác.Đối với công việc chính xác, hãy sử dụng [[NSNotificationCenter defaultCenter] postNotificationName: UIApplicationDidReceiveMemoryWarningNotification object: [UIApplication sharedApplication]]; –

5

Tôi đã viết một kịch bản táo sẽ búa trình mô phỏng có lỗi bộ nhớ, nó hơi khắc nghiệt nhưng nếu bạn ode tồn tại, sau đó bạn có thể tự tin hơn ...

on run 
repeat 100 times 
    tell application "System Events" 
     tell process "iOS Simulator" 
      tell menu bar 1 
       tell menu bar item "Hardware" 
        tell menu "Hardware" 
         click menu item "Simulate Memory Warning" 
        end tell 
       end tell 
      end tell 
     end tell 
    end tell 
    delay 0.5 
end repeat 
end run 
+0

Thật tuyệt, tôi thích điều đó – LolaRun

+0

Thật tuyệt vời khi có một tâm trí QA thực sự. Cảm ơn. – JJacquet

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