iphone - menguji apakah suatu objek ada

Saya memiliki beberapa objek di aplikasi saya yang bisa menjadi nihil di beberapa titik dan saya memiliki metode yang secara teori digunakan untuk membuat objek ini menjadi nihil.

Namun, jika saya mencoba memasukkan objek yang tidak ada ke nihil, aplikasi akan mogok.

Misalnya...

[object1 release];
object1 = nil;

//... dan setelah itu

[object1 removeFromSuperview]; // this will crash

Lalu saya berpikir, mengapa tidak menguji untuk melihat apakah objek tersebut ada sebelum menghapus...

if (object1 != nil)
 [object1 removeFromSuperview]; 
// this will crash too, because object1 cannot be tested for nil because it does not exist

Bagaimana saya bisa memeriksa apakah objek itu ada sebelum menguji apakah itu nihil? sesuatu sebagai

if (object1 exists( {
  if(object1 != nil))
    [object1 removeFromSuperview)
}

apakah ini mungkin?

SAYA MENAMBAHKAN INI UNTUK MENJELASKAN...

yang saya maksud adalah ini: bayangkan saya telah mendeklarasikan objek1 di header dan menginisialisasi kode. Jadi, itu ada dan menunjuk pada referensi yang valid. Suatu saat, benda tersebut mungkin akan terlepas, sehingga acuannya tetap menunjuk pada suatu benda namun benda tersebut telah dibebaskan. Bahkan jika saya meletakkan objek tersebut ke nil setelah melepaskannya, saya tidak dapat melakukan apa pun dengannya.

Masalahnya begini: Saya punya beberapa metode yang tidak sinkron. Salah satunya memindai beberapa objek dan menghapusnya jika ditemukan. Saya harus memeriksa apakah objek tersebut ada dan referensinya menunjuk ke objek yang valid sebelum melepaskannya lagi. Inilah intinya: bagaimana cara menguji apakah objek tersebut ada dan referensinya menunjuk ke objek yang valid dan ada sebelum melepaskannya lagi, untuk membatalkan pelepasan kembali objek yang sudah dirilis dan membuat aplikasi mogok.


person Duck    schedule 07.04.2010    source sumber
comment
Apakah maksud Anda objek1 di mana pun Anda memiliki objek? Saya berasumsi begitu.   -  person itsmatt    schedule 07.04.2010
comment
Saya telah mengklarifikasi pertanyaan awal. terima kasih.   -  person Duck    schedule 07.04.2010
comment
Anda mencampurkan penggunaan istilah penunjuk, referensi, dan objek. Istilah-istilah ini mempunyai arti yang sangat berbeda. Jika Anda tidak memahami perbedaan di antara keduanya, ada baiknya Anda membaca tentang pemrograman C. Jika Anda benar-benar memahaminya, akan membantu pembaca Anda jika Anda lebih berhati-hati dalam penggunaannya. Postingan Anda agak sulit dibaca karena ini.   -  person glorifiedHacker    schedule 07.04.2010


Jawaban (3)


Singkatnya, pertanyaan Anda untuk menentukan apakah penunjuk masih valid berada di jalur yang salah.

Setelah Anda melepaskan suatu objek, Anda harus segera menetapkan nilainya menjadi null agar Anda tidak lagi mengontrolnya. Jika dua metode berjalan secara asinkron dan mengakses objek yang sama, keduanya harus disinkronkan pada titik tersebut sehingga pelepasan dan pengaturan ke null terjadi pada waktu yang sama di satu thread sebelum thread lainnya sempat mengganggu.

person Ed Marty    schedule 07.04.2010

Apakah Anda hanya berspekulasi atau sudah benar-benar mencobanya? Karena pada bahasa pemrograman lain, memanggil metode pada nil akan menyebabkan crash. Di Objective-C ini tidak benar. Di Objective-C, Anda BISA mengirim pesan ke nil tanpa menyebabkan crash. Pesan-pesan ini tidak berpengaruh.

Faktanya, Anda bisa saja menjadi sangat tidak senonoh dan melakukan hal berikut tanpa henti:

[(id)nil setTitle:@"Testing"];  // This will not cause a crash

Jika aplikasi Anda mogok, itu bukan karena Anda mengirim pesan nihil. Namun, mungkin saja Anda gagal menyetel penunjuk ke nil dan Anda mengirim pesan ke objek di memori yang bukan milik Anda. Mengingat rincian yang Anda berikan dalam pembaruan Anda, yaitu bahwa Anda memiliki thread asinkron yang mengakses objek-objek ini, saya pikir kemungkinan besar Anda mengirim pesan ke pointer yang objeknya telah dirilis, namun belum disetel ke nil.

person glorifiedHacker    schedule 07.04.2010
comment
terima kasih. Saya tidak berspekulasi. Masalahnya seperti yang saya lihat sekarang bukanlah pengujian terhadap nihil adalah menguji validitas suatu referensi, sebelum melakukan pengujian. Bayangkan sebuah referensi yang menunjuk pada suatu pandangan yang dibebaskan. Referensinya valid tetapi objek yang direferensikannya juga tidak. - person Duck; 08.04.2010

Saya telah membandingkan suatu objek dengan nihil sebelumnya tanpa masalah.

person Lee Probert    schedule 07.04.2010
comment
terima kasih. Masalahnya seperti yang saya lihat sekarang bukanlah pengujian terhadap nihil adalah menguji validitas suatu referensi, sebelum melakukan pengujian. Bayangkan sebuah referensi yang menunjuk pada suatu pandangan yang dibebaskan. Referensinya valid tetapi objek yang direferensikannya juga tidak. Pokoknya terima kasih atas jawaban Anda. +1 untuk upaya membantu :-) - person Duck; 08.04.2010