2011-09-05 35 views
9

Tôi muốn lưu trữ các đối tượng khác nhau trong một NSCache và yêu cầu chúng tự động bị xóa khi cảnh báo bộ nhớ bị truy cập. Vì vậy, tôi đã viết thực hiện NSDiscardableContent sau đây mà tôi sử dụng để bọc các cá thể mà tôi đưa vào các giá trị trong một NSCache.Làm thế nào để sử dụng NSCache với việc thực hiện NSDiscardableContent chung

Nhưng tôi không bao giờ thấy chúng bị xóa khỏi bộ nhớ cache khi tôi chạy "Mô phỏng cảnh báo bộ nhớ". Có gì sai với việc thực hiện NSDiscardableContent của tôi? Hoặc tôi có cần phải làm điều gì khác để làm cho bộ nhớ cache thả các giá trị khi một cảnh báo bộ nhớ xảy ra?

/** @brief generic implementation of the NSDiscardableContent for storing objects in an NSCache */ 
@interface GenericDiscardableObject : NSObject<NSDiscardableContent> 
@property (nonatomic, retain) id object; 
@property (nonatomic) NSUInteger accessCount; 
+ (GenericDiscardableObject *)discardableObject:(id)ob; 
@end 

@implementation GenericDiscardableObject 
@synthesize object, accessCount; 

+ (GenericDiscardableObject *)discardableObject:(id)ob { 
    GenericDiscardableObject *discardable = [[GenericDiscardableObject alloc] init]; 
    discardable.object = ob; 
    discardable.accessCount = 0u; 
    return [discardable autorelease]; 
} 

- (void)dealloc { 
    self.object = nil; 
    [super dealloc]; 
} 

- (BOOL)beginContentAccess { 
    if (!self.object) 
     return NO; 
    self.accessCount = self.accessCount + 1; 
    return YES; 
} 

- (void)endContentAccess { 
    if (self.accessCount) 
     self.accessCount = self.accessCount - 1; 
} 

- (void)discardContentIfPossible { 
    if (!self.accessCount) 
     self.object = nil; 
} 

- (BOOL)isContentDiscarded { 
    return self.object == nil; 
} 
@end 
+0

Đây không phải là câu trả lời nhưng thực tế không tốt khi sử dụng cài đặt trong phương thức dealloc của bạn - bạn không biết liệu có ai đang nghe KVO hay không… Chỉ cần thực hiện '[object release]' thay thế :) – deanWombourne

+0

@deanWombourne There không được ai lắng nghe đối tượng trong - (void) dealloc, vì đối tượng không còn được giữ lại nữa. Hay tôi hiểu điều gì đó sai? Tôi chỉ yêu cầu bởi vì tôi thích tài sản deallocing, quá ... – radiospiel

+0

Chỉ cần beacause nó không được giữ lại nữa không có nghĩa là không ai đang lắng nghe;) Apple đưa vào chủ đề: http://developer.apple.com/library/ mac/# documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html và một cuộc trò chuyện thú vị hơn ở đây: http://www.cocoabuilder.com/archive/cocoa/242096-avoiding-kvo-in-dealloc.html – deanWombourne

Trả lời

8

Theo như tôi có thể biết, hành vi mặc định của NSCache là ném các đối tượng đi khi có cảnh báo bộ nhớ.

Vì vậy, bạn chỉ có thể lưu trữ các đối tượng "trần truồng" trong bộ nhớ cache như thể nó là một từ điển NSD, và chúng sẽ được dọn sạch khi bộ nhớ bị chặt. Bạn không cần phải bọc chúng trong một vật thể bị loại bỏ, hoặc làm bất cứ điều gì khác. Ví dụ.

[myCache setObject:foo forKey:@"bar"]; // foo will be released if memory runs low 

Đó là không phải là rất rõ ràng từ các tài liệu, nhưng như xa như tôi có thể nói, mục đích của giao thức <NSDiscardableContent> nội dung là để thực hiện hành vi phức tạp hơn trong đó một đối tượng có thể giải phóng thành phần phụ khi bộ nhớ thấp, mà không nhất thiết phải phát hành chinh no.

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