ORIGINAL POSTtableView.dequeueReusableCellWithIdentifier() powoduje, że aplikacja do powieszenia
Niedawno konwertowane naszą aplikację Swift 2.0 oraz iOS9. Jeden dziwny problem, który widzę, to to, że wywołania tableView.dequeueReusableCellWithIdentifier() powodują zawieszenie się aplikacji w symulatorze.
Kod
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
//hangs on the line below
let headersection: HeaderSectionCell = tableView.dequeueReusableCellWithIdentifier("SectionHeader") as! HeaderSectionCell
...
return headersection
}
nagłówka kołki użycia komórek
class HeaderSectionCell: UITableViewCell {
@IBOutlet var labelOne: UITextView!
@IBOutlet var labelTwo: UITextView!
@IBOutlet var textView: UITextView!
}
Symulator procesora przy 100%
Po naciśnięciu pauzy w Xcode, pokazuje mi, że jest zawieszone na tej funkcji Swift.
Oto niektóre z procedur gdzie iOS typami pętli pod kołdrą.
Wreszcie nasz Swift wywołanie dequeueReusableCellWithIdentifier()
tym konkretnym przypadku jest wiszące z funkcji tableView(tableView: UITableView, viewForHeaderInSection section: Int)
, ale jesteśmy również wiszące wewnątrz wywołania tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)
, z tym samym problemem.
Próbowałem odtwarzać właściwości komórek w edytorze scenorysów, ale nic nie wystaje z niczego innego niż inne widoki, które działają poprawnie.
EDIT
Wydaje się, że istnieje nieskończona pętli pomiędzy Fundacji libobjc.A.dylib, pod tym wywołaniu dequeReusableCellWithIdentifier(). W efekcie upewniłem się, że Fundacja została zaimportowana przed jakimkolwiek innym środowiskiem, i wyrzuciłem szkodliwą UITableViewCell do jej własnej klasy (była ponownie używana). Oryginalne wezwanie działa, ale jest jeszcze jeden, który wciąż jest w pętli pod okładkami Swift, nad którymi pracuję.
Uderzanie przerwa w nieskończonej pętli stawia mnie w tych samych miejscach stosu montaż:
Góra ślad stosu po pauzie:
libobjc.A.dylib`objc_msgSend:
0x107f6a800 <+0>: testq %rdi, %rdi
0x107f6a803 <+3>: jle 0x107f6a850 ; <+80>
0x107f6a805 <+5>: movq (%rdi), %r11
0x107f6a808 <+8>: movq %rsi, %r10
0x107f6a80b <+11>: andl 0x18(%r11), %r10d
0x107f6a80f <+15>: shlq $0x4, %r10
0x107f6a813 <+19>: addq 0x10(%r11), %r10
0x107f6a817 <+23>: cmpq (%r10), %rsi
0x107f6a81a <+26>: jne 0x107f6a820 ; <+32>
-> 0x107f6a81c <+28>: jmpq *0x8(%r10)
Top śladu stosu po innej pauzie:
Foundation`-[NSLocalizableString length]:
0x1071c5cbc <+0>: pushq %rbp
0x1071c5cbd <+1>: movq %rsp, %rbp
-> 0x1071c5cc0 <+4>: movq 0x80461(%rip), %rax ; NSLocalizableString._developmentLanguageString
0x1071c5cc7 <+11>: movq (%rdi,%rax), %rdi
0x1071c5ccb <+15>: movq 0x7436e(%rip), %rsi ; "length"
0x1071c5cd2 <+22>: popq %rbp
0x1071c5cd3 <+23>: jmpq *0x8ea77(%rip) ; (void *)0x0000000107f6a800: objc_msgSend
To tylko pętla tam iz powrotem pomiędzy tymi dwiema procedurami niższego poziomu, zużywając 100% procesora symulatora.
Po wielu godzinach próbowania wyjaśnienia, dlaczego nie mogłem zdezynfekować celi wielokrotnego użytku, byłem tak blisko wyskakiwania przez okno. Potem natknąłem się na twój post. Pomyślałem sobie, że "nie ma mowy, żeby to problem/naprawa" - niska i oto poprawiono problem. Może przegapiłem to w uwagach do wydania: "Jeśli nie wybierzesz lokalizacji, wprowadzisz nieskończoną pętlę, ale nie powiemy ci". DZIĘKUJĘ CI! – fischgeek