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 alloc
và init
. 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 :)
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
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
Được rồi, tôi nghĩ tôi hiểu. Cảm ơn rất nhiều. – cabaret