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
Đâ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
@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
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