2015-04-22 26 views
7

Tôi cần sử dụng bộ nhớ (MB) cho ứng dụng của mình theo lập trình trong Swift. Tôi tìm thấy mã mẫu cho Objective-C. Bất cứ ai cũng có thể giúp tôi chuyển đổi nó thành Swift. Cảm ơn!Cách sử dụng bộ nhớ trong Swift

void report_memory(void) { 
    struct task_basic_info info; 
    mach_msg_type_number_t size = sizeof(info); 
    kern_return_t kerr = task_info(mach_task_self(), 
          TASK_BASIC_INFO, 
          (task_info_t)&info, 
          &size); 
    if(kerr == KERN_SUCCESS) { 
    NSLog(@"Memory in use (in bytes): %u", info.resident_size); 
    } else { 
    NSLog(@"Error with task_info(): %s", mach_error_string(kerr)); 
    } 
} 

Trả lời

1

Cuối cùng tôi đã tìm được giải pháp. Vui lòng xem đoạn mã bên dưới.

func report_memory() { 
    // constant 
    let MACH_TASK_BASIC_INFO_COUNT = (sizeof(mach_task_basic_info_data_t)/sizeof(natural_t)) 

    // prepare parameters 
    let name = mach_task_self_ 
    let flavor = task_flavor_t(MACH_TASK_BASIC_INFO) 
    var size = mach_msg_type_number_t(MACH_TASK_BASIC_INFO_COUNT) 

    // allocate pointer to mach_task_basic_info 
    var infoPointer = UnsafeMutablePointer<mach_task_basic_info>.alloc(1) 

    // call task_info - note extra UnsafeMutablePointer(...) call 
    let kerr = task_info(name, flavor, UnsafeMutablePointer(infoPointer), &size) 

    // get mach_task_basic_info struct out of pointer 
    let info = infoPointer.move() 

    // deallocate pointer 
    infoPointer.dealloc(1) 

    // check return value for success/failure 
    if kerr == KERN_SUCCESS { 
     println("Memory in use (in MB): \(info.resident_size/1000000)") 
    } else { 
     let errorString = String(CString: mach_error_string(kerr), encoding: NSASCIIStringEncoding) 
     println(errorString ?? "Error: couldn't parse error string") 
    }  
} 
7

chỉnh sửa: oops, nên đã kiểm tra bản sao đầu tiên, Nate đã trả lời câu hỏi này là here. Mặc dù bạn có thể muốn lưu ý sự khác biệt nhỏ trong phiên bản của tôi, sử dụng withUnsafeMutablePointer.

Bạn sẽ bị giảm giá vì mọi người không thích "Làm cách nào tôi có thể chuyển đổi câu hỏi Obj-C này thành Swift", tuy nhiên trong trường hợp này, điều này có thể đủ công bằng vì chuyển đổi cụ thể này đặc biệt là lông. Tôi nghĩ rằng đây là làm việc:

func report_memory() { 
    var info = task_basic_info() 
    var count = mach_msg_type_number_t(sizeofValue(info))/4 

    let kerr: kern_return_t = withUnsafeMutablePointer(&info) { 

     task_info(mach_task_self_, 
      task_flavor_t(TASK_BASIC_INFO), 
      task_info_t($0), 
      &count) 

    } 

    if kerr == KERN_SUCCESS { 
     println("Memory in use (in bytes): \(info.resident_size)") 
    } 
    else { 
     println("Error with task_info(): " + 
      (String.fromCString(mach_error_string(kerr)) ?? "unknown error")) 
    } 
} 

Có một vài coercions cơ bản - sizeof trả về một Int, nhưng các cuộc gọi chức năng cần có một UInt32. Tương tự (và hơi giận dữ hơn một chút), TASK_BASIC_INFOInt32, nhưng cuộc gọi cần có UInt32.

Phần khó chịu đang chuyển trong tham số thứ ba. task_info đưa con trỏ đến nhiều loại cấu trúc khác nhau có kích thước khác nhau tùy thuộc vào loại thông tin bạn muốn. Vì vậy, bạn cần lấy một con trỏ từ đối tượng task_basic_info của bạn, sau đó đưa nó đến kiểu con trỏ cụ thể task_info thực sự muốn (nghĩa là, khi bạn lội qua tất cả các typedef, một con trỏ đến UInt32).

Các tài liệu cho task_info nói rằng tham số cuối cùng count được coi là một số trong những “số lượng tối đa số nguyên trong task_info” nhưng khi nó nói số nguyên Tôi đoán nó có nghĩa là số nguyên 32-bit do đó chia cho 4.

+0

Hey! Bạn đã tìm ra, làm thế nào để tìm thấy những giới hạn trước khi ứng dụng bắt đầu gửi cảnh báo bộ nhớ? nói cách khác, làm thế nào tôi có thể biết khi nào tôi "đẩy" việc sử dụng bộ nhớ ứng dụng, và tôi ngừng làm những gì bao giờ quá trình tôi đang làm? –

+0

Trong Swift 3, bây giờ tôi có được ' 'init' không có sẵn: sử dụng 'withMemoryRebound (để: Công suất: _)' để tạm thời xem như bộ nhớ khác type.' bố trí tương thích –

+0

Swift 3 giải pháp: http://stackoverflow.com/a/39048651/650558 –

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