2017-01-03 6 views
0

프로젝트에 J2ObjC를 사용하고 있습니다. 나는 모든 것을 설정했고 Java 클래스를 포함했습니다.Java (J2ObjC)에서 추출한 신속한 비 ARC Objective-C 클래스에서 인스턴스를 생성하고 있습니다. 누출되지 않았습니까?

Java 코드베이스가 번역/컴파일되지 않으므로 ARC를 사용 중지해야한다는 점에 유의하십시오. (J2ObjC 자체는 호가 비활성화 된 상태에서 사용하는 것이 좋습니다)

생성 된 파일 만 비활성화 할 수 없으므로 Project Inspector -> 대상 -> 빌드 설정 -> Apple LLVM 8.0 - 언어에서 Objective-C를 사용하지 않도록 설정했습니다.

그런 다음 Swift에서 내 ViewController를 만들고 Java에서 변환 된 클래스 (브리징 헤더에 포함 된 생성 된 .h 파일의 헤더)로 인스턴스화하지 않고 인스턴스화했습니다. 내가 ARC없이 Obj-C VC에서해야 할 dealloc/release를하지 말아야한다.

정상입니까/누출이 있습니까? 누설 안전 (Reach-safe)이란 말은 변환 된 클래스 객체를 인스턴스화하면 참조 횟수가 감소한 후 자동으로 ARC로 할당이 해제된다는 것입니다. (ARC는 Swift에서 비활성화 할 수 없습니다.)

Java 클래스에서 참조주기를 조심해야한다는 것을 알고 있지만 이는 누설 방지가 의미하는 바가 아닙니다.

+0

아마 이해가 안되지만, 프로젝트에서 ARC를 해제하여 이식 된 코드를 컴파일하면 ARC가 발생하지 않습니다. 자동 릴리즈되지 않은 것을 명시 적으로 릴리스해야합니다. '-fno-objc-arc'로 이식 된 코드 만 컴파일하는 것은 어떨까요? – danh

+0

비 -ARC 파일은 빌드 중에 j2objc에 의해 생성되고 빌드 단계에서는 나타나지 않고 Java 명령은 나타나지 않고 명령이 아무 효과가 없기 때문에 내가 할 수 없었습니다. 예, 프로젝트에서 ARC를 사용하지 않도록 설정 했으므로 Swift는 기본적으로 ARC이므로 변경할 수 없습니다. 컴파일러가 경고 또는 오류를 표시하지 않기 때문에 여전히 적용되는지 궁금합니다. – BlackBox

+0

objective-C 태그가 날 버렸다. – danh

답변

0

왜 ARC를 비활성화해야합니까? j2objc 생성 코드는 ARC (details here)의 유무에 관계없이 작동해야합니다. ARC를 사용하지 않는 것이 좋습니다. ARC는 생성 된 코드가 약간 느려지므로 코드가 메모리를 올바르게 관리해야하는 메모리 모델이 있기 때문입니다.

누수가없는 경우 가비지 수집에 문제가되지 않는 참조주기를 가질 수있는 Java 코드에 따라 달라질 수 있습니다. J2ObjC의 cycle_finder은 이러한주기를 많이 찾을 수 있으며 Xcode Instruments Leaks 도구를 실행하면 다른 것을 찾을 수 있습니다.