2017-09-14 1 views
-1

Objective C와 상호 운용되는 Swift 코드가 있는데 누수가있는 것으로 나타났습니다. 클로저를 제거하지 않고 NSMutableArray로 축소했습니다. 문제를 재현하는 순수 Swift 스 니펫 :NSMutableArray에 클로저 객체를 추가 한 다음 작동하지 않는다 - LOOK

let myClosure : ((String?) ->())! = { (fileName: String?) in 
} 

let arr = NSMutableArray() 
arr.add(myClosure) 
arr.remove(myClosure) 

이 문제가 발생한 사람은 누구입니까? 어떻게 작동시킬 수 있습니까?

+2

클로저가 동일성을 비교할 수 없기 때문에 작동하지 않습니다. https://stackoverflow.com/questions/24111984/how-do-you-test-functions-and-closures-for-equality. - 클로저를 핸들러 클래스로 랩핑하는 것과 같은 Q & A에서 가능한 일시적인 해결책이 있습니다. –

+0

고마워요, 당신이 제안한 것에 대해 생각한 다음 API를 다음과 같이 변경했습니다. 배열에 클로저를 추가하는 메서드는 인덱스를 반환하고 배열에서 제거하는 메서드는 이전 메서드에서 반환 한 인덱스를 사용합니다. –

답변

-1

다시 강조하기 위해 우리 코드베이스는 ObjC와 상호 작용하는 Swift를 사용합니다. 따라서 제 경우에는 순수 스위프트를 쉽게 수행 할 수 없습니다.

NSUInteger 핸들에서 클로저로 매핑하는 NSDictionary를 사용하도록 API를 변경했으며 해당 정수를 사전에서 클로저를 제거하는 데 사용했습니다.

해당 API의 목적은 수신기 콜백을 등록하고 등록 취소 기능을 사용하는 것입니다. 따라서 NSUInteger 핸들은 제거 비트를 만족시킵니다.

1

클로저에는 참조가 없으므로 배열에서 클로저 객체를 제거 할 수 없으므로 배열에서 제거되지 않습니다.

귀하의 코드

let arr1 = NSMutableArray() 
arr1.add(myClosure)  
print(arr1)   //("(Function)") 
arr1.remove(myClosure) 
print(arr1)   //("(Function)") 

솔루션

var arr = Array<Any>() 
arr.append(myClosure) 
print(arr)   //[(Function)] 
arr.remove(at: 0) 
print(arr)   //[] 

당신도 내가 당신을 추천 대신 폐쇄 인스턴스의 요소를 제거하기 위해 인덱스를 사용하기 때문에,이 인덱스에서 제거합니다 Swift에서 순수한 신속한 수업을 사용하십시오.

+0

제안을 주셔서 감사합니다. 그러나이 솔루션은이 경우에는 좋지 않습니다. 제약 조건은 제거 할 수없는 기존 ObjC interop이 있다는 것입니다. –

+0

공식 문서가 있습니까? –

+0

내가 작업중인 코드베이스의 내부 요구 사항입니다. –

관련 문제