Skip to content

Commit d8c8205

Browse files
naitharparkera
authored andcommitted
fix NSCache limit (#900)
1 parent 8fc2167 commit d8c8205

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

Foundation/NSCache.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,9 @@ open class NSCache<KeyType : AnyObject, ObjectType : AnyObject> : NSObject {
138138
insert(entry)
139139
}
140140
} else {
141-
_entries[keyRef] = NSCacheEntry(key: key, value: obj, cost: g)
141+
let entry = NSCacheEntry(key: key, value: obj, cost: g)
142+
_entries[keyRef] = entry
143+
insert(entry)
142144
}
143145
_lock.unlock()
144146

TestFoundation/TestNSCache.swift

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ class TestNSCache : XCTestCase {
2121
return [
2222
("test_setWithUnmutableKeys", test_setWithUnmutableKeys),
2323
("test_setWithMutableKeys", test_setWithMutableKeys),
24-
// ("test_countLimit", test_countLimit),
24+
("test_costLimit", test_costLimit),
25+
("test_countLimit", test_countLimit),
2526
]
2627
}
2728

@@ -73,19 +74,36 @@ class TestNSCache : XCTestCase {
7374
XCTAssertNil(cache.object(forKey: key2), "should be nil")
7475
}
7576

77+
func test_costLimit() {
78+
let cache = NSCache<NSString, NSString>()
79+
cache.totalCostLimit = 10
80+
81+
cache.setObject("object0", forKey: "0", cost: 4)
82+
cache.setObject("object2", forKey: "2", cost: 5)
83+
84+
cache.setObject("object1", forKey: "1", cost: 5)
85+
86+
XCTAssertNil(cache.object(forKey: "0"), "should be nil")
87+
XCTAssertEqual(cache.object(forKey: "2"), "object2", "should be equal to 'object2'")
88+
XCTAssertEqual(cache.object(forKey: "1"), "object1", "should be equal to 'object1'")
89+
}
90+
7691
func test_countLimit() {
7792
let cache = NSCache<NSString, NSString>()
78-
cache.countLimit = 1
93+
cache.countLimit = 2
7994

8095
let key1 = NSString(string: "key1")
8196
let key2 = NSString(string: "key2")
97+
let key3 = NSString(string: "key3")
8298
let value = NSString(string: "value")
8399

84100
cache.setObject(value, forKey: key1)
85101
cache.setObject(value, forKey: key2)
102+
cache.setObject(value, forKey: key3)
86103

87104
XCTAssertEqual(cache.object(forKey: key2), value, "should be equal to \(value)")
105+
XCTAssertEqual(cache.object(forKey: key3), value, "should be equal to \(value)")
88106
XCTAssertNil(cache.object(forKey: key1), "should be nil")
89-
107+
90108
}
91109
}

0 commit comments

Comments
 (0)