2014-07-24 3 views
3
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

와우, 생성 된 목록 뮤 테이타? addDefinitionsObject의 이름을 다른 것으로 변경해도이 문제가 해결됩니다. 이는 정말 이상하게 보입니다. – carlossless

+0

성취하려는 것은 무엇입니까? – zaph

답변

2

은 "키 - 값 코딩 프로그래밍 가이드" (강조 광산)에서 "Accessor Search Pattern for Unordered Collections"에서 :

다음과

mutableSetValueForKey:의 기본 검색 패턴이 될 때 : 방법에 대한

  • 검색 수신기의 클래스 그 이름은 패턴 add<Key>Object:remove<Key>Object: ( NSMutableSet 원시 메소드 addObject: 및에 해당합니다. ) 및 add<Key>:remove<Key>: ( NSMutableSet 메소드 unionSet : 및 minusSet :)에 해당합니다. 적어도 하나의 부가 방법 및 add<Key>Object:, remove<Key>Object:, add<Key>:, 및 remove<Key>: 메시지의 조합에 을 초래할 것이다 수집 프록시 객체에 전송 된 각각 NSMutableSet 메시지를 발견 적어도 하나의 제거 방법은 원래의 수신기로 전송되는 경우 mutableSetValueForKey:
  • ... 의미

addDefinitionsObjectremoveDefinitionsObject 모두 따라서 다음 클래스에서 재귀를

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

전화

self.addDefinitionsObject(value) 

을 구현합니다.

관련 문제