Khi thêm các mục vào NSMutableDictionary
bằng cách sử dụng phương pháp setValue:forKey:
(Tôi cho rằng điều này khái quát hóa với bất kỳ NSObject
) nào từ điển giữ lại tham số thứ hai, NSString
?[NSMutableDictionary setValue: value forKey: key] có giữ phím NSString không?
Ví dụ:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
NSString *theString = @"hello";
int i;
for (i=0; i<[theString length]; i++){
NSNumber *myInt = [NSNumber numberWithInt:i];
NSString *character = [NSString stringWithFormat:@"%C",[theString characterAtIndex:i]];
[dict setValue: myInt forKey:character];
}
[dict release];
[pool release];
Rõ ràng, không có lý do để giải phóng myInt
trong vòng lặp, nó được giữ lại bởi dict
nên nó không thể được phát hành cho đến cuối của mã này. Nhưng có đúng sự thật là character
không? Suy nghĩ của tôi là nếu NSMutableDictionary
lưu trữ chuỗi theo một cách khác, thì người ta có thể tạo một nhóm tạm thời quanh vòng lặp và giải phóng các chuỗi đó thay vì đợi đến khi phát hành từ điển.
Tôi cũng tò mò là tại sao retainCount
của character
là 7fffffff như thể nó là một NSConstantString
, tôi mong chờ stringWithFormat
để trả lại một đối tượng NSString
mà sẽ cần phải giữ lại, nhưng điều đó dường như không phải là trường hợp.
Chỉ là một điểm tốt không xứng đáng với câu trả lời: trong mã 10.4 và sau đó, thường thích hợp hơn khi sử dụng [pool drain] - khi GC bật, cống cung cấp gợi ý rằng * có thể * là tốt thời gian để thu thập tài liệu tham khảo cũ, trong khi phát hành trở thành một no-op. Với GC tắt, chúng hoạt động giống nhau. –
Đây là câu hỏi cũ nhưng bạn có thể sử dụng 'setObject: forKey:' để thay thế. [xem tại đây] (http://stackoverflow.com/questions/1249634/wheres-the-difference-between-setobjectforkey-and-setvalueforkey-in-nsmutabl) –