2017-11-02 1 views
-1

저는 응용 프로그래머입니다. Java로 여러 Android 앱을 작성했으며 React/Redux의 SPA를 작성했습니다. 최근에, 안드로이드 개발을 위해 Kotlin을 사용하기 시작했고 Swift와 함께 iOS world에 입사했습니다.정적 컬렉션에 함수를 저장하면 시스템에 어떤 영향을 미칩니 까?

React에 대한 나의 경험은 다소 멋졌습니다. 나는 반응성의 개념을 좋아했다. 그리고이 개념을 내 모바일 앱에 적용하는 것이 좋을 것이라고 생각했습니다. 나는 Rx libraries의 무리가 있다는 것을 압니다. 그냥 gradle-cocoapods-sync-use가 아닌, 교육적인 목적으로 어떻게 든 내 자신의 길을 찾고 싶었습니다. 나는 그것을 견딜 수 없었다. 그래서 수 시간의 연구 끝에이 아이디어를 생각해 냈습니다.

것은이 전 서버에서 일부 JSON 배열을 받고 있어요 가정 해 봅시다 :

다음은 일입니다. 그때는 파싱 정적 클래스 (또는 object in Kotlin)을 보관하고 I가

AppContext를 호출은 이런 기능의 배열과 데이터 자체 갖는다 : UI에이어서

var onItemsChanged: MutableList<() -> Unit> = mutableListOf() 
var items: List<Data>? by Delegates.observable(null) { _: KProperty<*>, _:List<Data>?, _: List<Data>? -> 
    for(callback in onItemsChanged) 
     callback() 
} /* or didSet{} in Swift */ 

을 가치 변화 이벤트를 듣고 싶을 때마다 글을 쓸 것입니다.

AppContext.onItemsChanged.add { updateUI() } 
/* and of course UI references AppContext.items */ 

이것은 제가 생각한 거의 모든 것입니다. 그러나 고려해야 할 부분이 있다고 생각합니다.

내 질문은 : 쓰레기 Collecter가 UI 개체 (. 예를 들어, 조각)를 수집

  1. 어떤 경우 그 람다 콜백 기능이있는 gc'd 개체에서 onItemsChanged 배열에 추가하는 경우 다음 어떤 일이 일어날 것인가?

  2. 그리고이 아이디어에 대해 어떻게 생각하십니까? 네가 나라면 어떻게 할거 니?

  3. "그냥 RxSomething을 사용하여"말을하지 마십시오

감사합니다!

+1

스위프트에 대해 이야기하는 경우 가비지 수집기가 없습니다. – ColGraff

+0

Kickstarter는 Kotlin 및 Swift로 앱을 제작하고 반응 형 라이브러리를 사용합니다 (어떤 라이브러리인지 모름). 두 세트의 코드는 모두 오픈 소스이기 때문에 그들이 한 일을 볼 수 있습니다. –

답변

1

Java에서 static 필드는 가비지 수집되지 않습니다. 따라서 코드가 작동합니다.

그러나 연습입니다.

위에서 말한 것처럼 onItemsChangedgc이 아닙니다. 무거운 물체를 참조 할 경우 (활동으로 표시) gc이되지 않으므로 메모리 누수가 발생합니다 ().

Kotlin은 Java 기반으로 제작되었으며, 람다는 일부 경우를 제외하고는 객체를 생성합니다 (thisthis 참조).

1

iOS/Swift는 가비지 수집기를 사용하지 않습니다. iOS는 강력한 참조를 기반으로하는 다른 메모리 관리 모델 인 ARC를 사용합니다.

개체에 대한 강력한 참조를 유지하면 해당 개체는 해제되지 않습니다.

나는 Kotlin을 모른다. 코드 스 니펫을 따라 가기가 조금 힘들지만 closure (lambdas) 배열을 유지하는 것이 좋다.

관련 문제