class TestClass : NSObject {
var definitions: NSSet = NSSet()
func addDefinitionsObject(value: AnyObject) {
self.mutableSetValueForKey("definitions").addObject(value)
}
func removeDefinitionsObject(value: AnyObject) {
// this method is never called
self.mutableSetValueForKey("definitions").removeObject(value)
}
}
var test = TestClass()
test.addDefinitionsObject("yo")
运行它会导致无限递归,最终会因EXC_BAD_ACCESS而崩溃。任何想法为什么会发生这种情况?
奇怪的是,只有在定义removeDefinitionsObject
时才会发生这种情况。如果我删除该功能,问题就会消失。
答案 0 :(得分:2)
来自“键值编码编程指南”中的"Accessor Search Pattern for Unordered Collections" (强调我的):
mutableSetValueForKey:
的默认搜索模式如下:
- 在接收者的类中搜索名称与之匹配的方法 模式
add<Key>Object:
和remove<Key>Object:
(对应于NSMutableSet
原始方法addObject:
和removeObject:
分别)和add<Key>:
和remove<Key>:
(对应于 NSMutableSet方法unionSet:和minusSet :)。 如果每个都找到至少一种添加方法和至少一种删除方法 将生成发送到集合代理对象的NSMutableSet
消息 在add<Key>Object:
,remove<Key>Object:
,add<Key>:
的某种组合中, 和remove<Key>:
消息被发送到原始接收者mutableSetValueForKey:
。- ...
这意味着如果同时addDefinitionsObject
和removeDefinitionsObject
在你的班级实施,然后
self.mutableSetValueForKey("definitions").addObject(value)
呼叫
self.addDefinitionsObject(value)
因此递归。