2009-03-22 38 views
6

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.

+0

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. –

+0

Đâ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) –

Trả lời

8

Nó rất phổ biến trong cacao cho các thông số NSString được sao chép thay vì giữ lại. Đó là bởi vì bạn có thể dễ dàng đưa ra từ điển một ví dụ của NSMutableString. Bởi vì giá trị của chuỗi có thể thay đổi, NSDictionary tạo một bản sao.

Nhưng, bất kể cách NSMutableDictionary thực sự hoạt động, bạn không phải lo lắng liệu có cần giữ lại character hay không. Khi bạn đã chuyển nó tới NSMutableDictionary làm tham số, thực sự là vấn đề của lớp để quyết định cách lưu trữ dữ liệu, trừ khi tài liệu cụ thể cho bạn biết rằng việc giữ lại các đối tượng là trách nhiệm của bạn.

Tôi cũng sẽ không lo lắng quá nhiều về số retainCount của bất kỳ đối tượng nào. Theo sát số lượng của vật thể quá chặt có thể dẫn bạn xuống hố thỏ khiến bạn quay bánh xe.

Cuối cùng, tôi thực sự không nghĩ rằng bạn cần tạo hồ bơi tự động của riêng mình tại đây. Trừ khi bạn biết chắc chắn rằng theString sẽ rất dài, hoặc bạn đã quan sát việc sử dụng bộ nhớ cao trong Dụng cụ, việc thêm vào nhóm tự động sửa lỗi là một tối ưu hóa không cần thiết.

4

Bạn không cần giữ lại character ở đó, từ điển sẽ giữ lại khi bạn đặt nó làm khóa và mã của riêng bạn không cần phải giữ lại.

Bạn cũng không cần phải lo lắng về lý do số lần giữ lại không phải là những gì bạn mong đợi. Có lẽ khuôn khổ Foundation có các trường hợp giống như Flyweight của một tải các cá thể đơn NSString. Trong bất kỳ trường hợp nào nếu bạn đã quản lý bộ nhớ đúng theo các hướng dẫn, bạn sẽ OK bất kể khung làm việc đằng sau hậu trường. http://iamleeg.blogspot.com/2008/12/cocoa-memory-management.html

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