Pertanyaan Kapan saya harus menghapus pengamat? Kesalahan tentang membatalkan objek sebelum menghapus pengamat


Saya mencoba menggunakan pengamatan nilai kunci di salah satu kelas saya. Saya mendaftarkan pengamat dalam metode init dan menghapus / menderegister mereka di dealloc, tetapi saya mendapatkan kesalahan berikut yang tampaknya terjadi sebelum metode dealloc saya dipanggil, sesuai dengan cetakan debug saya.

Instance 0x583870 dari kelas TekkPoint sedang dialihkan sementara pengamat nilai kunci masih terdaftar dengannya. Informasi observasi sedang bocor, dan bahkan mungkin secara keliru melekat pada objek lain. Atur breakpoint pada NSKVODeallocateBreak untuk berhenti di sini di debugger. Berikut ini info observasi terkini:  (  Konteks: 0x0, Properti: 0x536400>  Konteks: 0x0, Properti: 0x55aba0> )

Apakah ada cara tertentu saya harus menghapus pengamat? Atau mungkin tempat tertentu yang harus saya keluarkan?

Menurut Ini pertanyaan Saya melakukan hal yang benar, tetapi mengapa saya harus menerima pesan kesalahan ini?

Berikut ini adalah rutinitas dealloc saya:

- (void)dealloc {
  // Remove all observers.
  for (NSString *path in [TekkPoint observedPaths]) {
    [self removeObserver:[option_ tChart]
          forKeyPath:path];

  }

  [description_ release];
  [weight_ release];
  [super dealloc];
}

Satu hal yang perlu dicatat yang mungkin aneh tentang implementasi saya adalah bahwa saya menambahkan dan mengeluarkan pengamat dari pengamatan, bisakah ini menyebabkan masalah saya?


32
2018-06-13 05:46


asal


Jawaban:


Ah. Anda sedang mengamati a TekkPoint objek dari a SomethingElse objek, dan SomethingElse objek yang menambah dan menghapus pengamat, benar? (Itulah cara normal yang dilakukan; Saya hanya mencoba untuk menjelaskan.)

Sepertinya Anda TekkPoint objek sedang dialihkan sementara SomethingElse yang mengamati itu masih ada. Itu SomethingElse metode dealloc tidak dipanggil karena itu TekkPoint yang sedang dialihkan, bukan SomethingElse.

Jika Anda berencana mengamati objek yang mungkin hilang sebelum pengamat menghilang, maka Anda perlu beberapa cara untuk memberi tahu pengamat bahwa mereka harus menghapus pengamat mereka. Anda TekkPoint bisa memiliki alive properti yang juga akan diamati oleh SomethingElse, dan kapan disetel ke NO lalu semua orang mengamati TekkPoint akan menghapus dirinya sebagai pengamat.


46
2018-06-13 18:22



Apakah kamu menelpon? [super dealloc]  sebelum Anda menghapus pengamat Anda? Memanggil super dealloc terlalu dini dapat menyebabkan kesalahan seperti ini.


2
2018-06-13 07:08



mengapa kamu menelepon

[super dealloc]

Dari dokumentasi apel di dealloc

In an implementation of dealloc, do not invoke the superclass’s implementation

0
2018-05-14 15:30



Kode normal terlihat seperti ini:

- (void) dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

Periksa kembali tanda tangan Anda dari metode dealloc Anda (Objective C sangat tidak memaafkan dan tidak akan pernah memperingatkan Anda ketika Anda mengacaukan nama metode). Misalnya, jika nama metode Anda "dealoc" (dengan satu l), dealloc Anda tidak akan pernah dipanggil.

Jika tidak, edit pertanyaan Anda untuk memasukkan reoutine dealloc Anda.


-10
2018-06-13 09:04