온라인으로 여러 기사를 읽는 데 일주일 이상을 투자했습니다. & StackOverflow Q & 스위프트 배열을 메모리 관리로 UIViewController
번으로 내 앱에서 계속 충돌하고 있습니다. 네가 도울 수 있기를 바란다.스위프트 배열/컬렉션 메모리 관리
부모 클래스 컨트롤러를 상속 한 여러 하위 클래스 (예제를 사용하여 단순화 한)와 부모 클래스 컨트롤러가 있습니다.
class ParentViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
lazy var results: [AnyObject] = [AnyObject]() //can contain various classes, such as Product, User, etc.
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return results.count
}
...
}
class SubViewController: ParentViewController {
... loads results Array via REST API, then then appends to array using
results.append(Product())
}
무작위로, 나는이 같은 충돌을 얻을 것 :
EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x0000000a1abb4b17
Thread : Crashed: com.apple.main-thread
0 libobjc.A.dylib 0x000000019478fe10 cache_getImp + 16
1 libobjc.A.dylib 0x0000000194784a6c lookUpImpOrForward + 540
2 libobjc.A.dylib 0x000000019478fdb8 _objc_msgSend_uncached_impcache + 56
3 libswiftCore.dylib 0x00000001004d4e40 _ZN5swift12metadataimpl14ValueWitnessesINS0_17ObjCRetainableBoxEE18initializeWithCopyEPNS_11OpaqueValueES5_PKNS_8MetadataE + 24
4 libswiftCore.dylib 0x000000010036e3cc _TFSa6appendU__fRGSaQ__FQ_T_ + 92
내 이해를 바탕으로, 나는 results
이 results.append()
가 호출 될 때까지는 더 이상 메모리에 있기 때문에이 없다 생각합니다.
특히 하위 클래스가있는 경우 UIViewController에서 배열/컬렉션을 인스턴스화하는 가장 좋은 방법은 무엇입니까? 다음은 내 생각입니다. 모든 의견을 환영합니다.
1. 부모 클래스로 lazy
을 사용하십시오. 이것은 내가 deinit()
를 사용하여 메모리 할당을 해제해야이 여전히 또한, 충돌이 발생, 기본 케이스이며, SubViewController
에서
lazy var results: [AnyObject] = [AnyObject]()
2.Init 충돌의 원인은? 부모 클래스에서
in ParentViewController
var results: [AnyObject]
in SubViewController
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.results = [Product]()
}
3.Make results
선택 사항이 선택적 항목을 확인하기 위해 부모 클래스의 모든 방법을 필요로한다. 배열을 init
또는 viewDidLoad()
에 초기화해야합니까? 또한, deinit
결과가 있어야합니까? 부모 클래스에서 제외하려면?
in ParentViewController
var results: [AnyObject]?
deinit {
results = nil
}
in SubViewController
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.results = [Product]()
}
모든 의견을 환영합니다.
감사합니다. 불행하게도 라이프 사이클은 실제 컨트롤러의 수명주기 동안 애플리케이션 폭이 아닙니다. – Dean