为什么以下代码会导致无限递归?

时间:2014-07-24 19:16:58

标签: swift

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时才会发生这种情况。如果我删除该功能,问题就会消失。

1 个答案:

答案 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:
  •   
  • ...
  •   

这意味着如果同时addDefinitionsObjectremoveDefinitionsObject 在你的班级实施,然后

self.mutableSetValueForKey("definitions").addObject(value)

呼叫

self.addDefinitionsObject(value)

因此递归。