2011-08-03 46 views
5

Tôi đọc qua cuốn sách Big Nerd Ranch về lập trình iOS và tôi đã có một câu hỏi về chương trình Hypnotime họ tạo ra trong chương 7.iOS quản lý bộ nhớ cơ bản

Tại một số điểm, họ thực hiện các phương pháp sau đây:

- (void)showCurrentTime:(id)sender 
{ 
    NSDate *now = [NSDate date]; 

    static NSDateFormatter *formatter = nil; 

    if (!formatter) { 
     formatter = [[NSDateFormatter alloc] init]; 
     [formatter setTimeStyle:NSDateFormatterShortStyle]; 
    } 

    [timeLabel setText:[formatter stringFromDate:now]]; 

} 

Câu hỏi của tôi là về NSDateFormatter *formatter. Trình định dạng được tạo với allocinit. Tôi luôn biết rằng bất cứ điều gì với alloc cần phải được phát hành ở đâu đó, phải không? Khi formatter được chuyển đến timeLabel, không timeLabel gửi retain cho nó? Và không thể (không nên?) Tôi sau đó phát hành formatter?

Tôi duyệt qua mã trên một vài trang tiếp theo và tôi không thể tìm thấy bất kỳ thư phát hành nào ở bất kỳ đâu, ngoại trừ release đang được gửi tới timeLabel trong dealloc.

Tôi có pha trộn mọi thứ ở đây không? Có lý do nào khiến tôi không được tôi phát hành formatter không? Tôi muốn trở thành một công dân trí nhớ tốt. Bất kỳ trợ giúp nào được đánh giá cao :)

Trả lời

1

Họ tuyên bố định dạng như tĩnh nên mục đích là để giữ cho các định dạng sống cho toàn bộ cuộc đời của ứng dụng. Điều này sẽ vì lý do hiệu suất và có thể là một tối ưu hóa trước khi trưởng thành, do đó, không thực hiện điều này như là một thực hành tốt nhất trong phát triển tương lai của riêng bạn.

//static (even in a method) will allow formatter to live during entire app lifecycle 
static NSDateFormatter *formatter = nil; 

//Check if formatter has been set (this is not thread safe) 
if (!formatter) { 
    //Set it once and forget it, it wont be a leak, and it wont ever be released 
    formatter = [[NSDateFormatter alloc] init]; 
    [formatter setTimeStyle:NSDateFormatterShortStyle]; 
} 
+0

Cảm ơn lời khuyên. Nếu nó được giữ cho toàn bộ thời gian tồn tại của ứng dụng, điều đó có nghĩa là tôi nên phát hành nó trong dealloc hoặc không phát hành nó ở tất cả? Một chút nhầm lẫn về điều này, phải trung thực. – cabaret

+0

Không có ý định không được tiết lộ và nó sẽ không tạo ra rò rỉ bộ nhớ trừ khi gán lại trình định dạng với việc phát hành nó trước. Đó là lý do tại sao có một kiểm tra nếu. – Joe

+0

Được rồi, tôi nghĩ tôi hiểu. Cảm ơn rất nhiều. – cabaret

1

setText chỉ nhận được một chuỗi (không phải là trình định dạng), do đó trình định dạng không được giữ lại. Đặt cược của tôi là họ sử dụng trình định dạng ở một nơi khác trong bộ điều khiển và do đó nó được phát hành trong dealloc

+0

đừng bận tâm phần dealloc, không thấy nó là tĩnh, nhưng phần đầu tiên vẫn đúng – ksn

+0

OK, cảm ơn. Tôi sẽ ghi nhớ điều đó về setText. :) – cabaret

2

Do từ khóa static từ formatter sẽ vẫn có sẵn cho đến khi phương pháp này được gọi là biến toàn cục. là toàn cầu

Xem wikipedia nhập về static

+0

Cảm ơn bạn đã trả lời nhanh. Mục wiki đã xóa một số điều về 'static' up :) – cabaret

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