Baru-baru ini saya melihat seorang netizen bertanya di Internet: Bagaimana cara menentukan apakah penunjuk objek tersedia? Dengan kata lain, bagaimana cara menentukan apakah penunjuk objek menunjuk ke contoh objek nyata yang dapat digunakan? Sebenarnya hal ini seharusnya tidak menjadi masalah. Karena bagi programmer, ia harus bisa mengontrol programnya agar tidak mengakses pointer yang tidak valid, karena pembuatan dan penghancuran semua instance objek berada di bawah kendalinya. Dan bahkan jika tidak ada cara langsung untuk menentukan apakah penunjuk objek tersedia, hal ini juga dapat dilakukan melalui cara tidak langsung lainnya (seperti menggunakan beberapa pengidentifikasi, dll.) (misalnya, ketika kita menghancurkan sebuah instance objek, kita mengatur penunjuk objek yang dituju adalah nihil). Namun jika kita mengesampingkan dua poin yang disebutkan di atas dan hanya mempelajari apakah ada cara untuk menentukan apakah suatu penunjuk objek tersedia di Delphi, apa yang akan terjadi?
Dalam Object Pascal, suatu kelas dapat memiliki dua jenis metode, yang satu disebut metode objek (Object Method) dan yang lainnya adalah metode kelas (Class Method). Yang disebut metode objek berarti bahwa definisi metode adalah untuk suatu objek (atau instance), jadi pemanggilan metode tersebut harus didasarkan pada suatu objek (atau instance). Misalnya, destruktor Destroy suatu kelas adalah sebuah objek metode (pada kenyataannya, kita sering menggunakan metode objek). Metode kelas mengacu pada definisi metode berdasarkan kelas objek, sehingga pemanggilan metode tidak perlu didasarkan pada contoh objek tertentu, seperti konstruktor Buat kelas. Hal ini memberikan inspirasi bagi kita. Menentukan apakah penunjuk objek tersedia tampaknya dapat dilakukan melalui langkah-langkah berikut. Pertama, kita dapat menentukan apakah penunjuk objeknya nihil. Jika ya, maka kita sudah selesai dan pasti tidak tersedia, jika tidak, coba jalankan metode objek dari objek tersebut untuk melihat apakah ada pengecualian seperti akses memori yang tidak valid. Ini digunakan untuk menentukan apakah objek tersebut tersedia. Gunakan kode berikut untuk memverifikasi ide kami:
var
Obj: TObjek;
mulai
Obj := TObject.Buat; //1
Obj.Free; //2. Lepaskan objek yang baru saja dibuat, dan memori didaur ulang saat ini
Jika Obj = nil maka //3. Tentukan apakah pointer kosong (langkah ini sering kali tidak berhasil karena objek
//dilepaskan, Delphi tidak akan secara otomatis mengosongkan penunjuk objek)
ShowMessage('Penunjuk objek tidak tersedia.')
kalau tidak
mulai
Mencoba
Jika Obj.ClassType = TObject maka //4. Panggil metode objek TObject
ShowMessage('Jenis objeknya adalah TObject');
Kecuali
ShowMessage('Penunjuk objek tidak tersedia.')
Akhir;
akhir;
akhir;
Dengan mengeksekusi kode di atas, kami menemukan bahwa Obj.ClassType masih tersedia meskipun Obj.Free telah dijalankan. Hal ini menunjukkan bahwa tidak semua metode objek harus bergantung pada instance objek agar dapat diakses. Alasannya adalah metode objek ini tidak perlu mengakses memori yang diminta oleh instance objek. Dalam pengertian ini, metode TObject.ClassType tidak terlihat seperti metode objek nyata, melainkan menyerupai metode kelas.
Dengan mengeksekusi kode di atas, kita juga dapat menemukan bahwa ketika suatu objek menjalankan metode Gratis, ia hanya melepaskan semua memori yang digunakannya saat dibuat, namun tidak mempengaruhi nilai penunjuk objek itu sendiri. Penunjuk objek masih menunjuk ke alamat memori asli. Pada saat yang sama, karena kekhasan implementasi beberapa metode objek (seperti ClassType), meskipun objek tersebut telah dirilis, hasil pemanggilan metode objek tetap benar.
Singkatnya, kita dapat menarik kesimpulan, yaitu apakah suatu penunjuk objek dapat dinilai tersedia bergantung pada apakah kelas tempat penunjuk objek tersebut berada menyediakan cara untuk mengakses memori instance objek - cara ini dapat Metode juga dapat menjadi properti. Lantas, bagaimana situasi saat ini khususnya di setiap kategori?
TObject, kelas ini adalah kelas leluhur dari semua kelas, tidak ada cara untuk membuat penilaian.
TPersistent, berasal dari TObject, tidak perlu menggunakan memori tambahan saat membuat instance objek, jadi tidak ada cara untuk menilai.
TComponent, berasal dari TPersistent, menambahkan banyak properti yang memerlukan memori tambahan untuk diterapkan saat membuat instance objek, sehingga secara teori, hal tersebut dinilai. Kodenya adalah sebagai berikut:
function ComponentExists(AComponent: TComponent): Boolean;
mulai
mencoba
AComponent.Hasparent; //Catatan: Kalimat ini juga bisa berupa "AComponent.Tag;"
//Atau "AComponent.Name"
hasil := Benar;
kecuali
hasil := Salah;
akhir;
akhir;
Dengan memanggil ComponentExists, kita dapat mengetahui apakah penunjuk objek bertipe TComponent tersedia, terlepas dari apakah penunjuk objek telah dilepaskan atau disetel ke nil.
Untuk kelas lain, seperti TControl, TWinControl, atau TButton, dll., selama berasal dari TComponent, metode penilaian TComponent tetap berlaku.
Ada kelas lain yang ditentukan pengguna. Jika kelas tersebut diturunkan langsung dari kelas yang tidak dapat dinilai (seperti TObject dan TPersistent), tetapi tidak ada atribut yang memerlukan aplikasi memori selama pembuatan instance, maka tidak ada cara untuk menilai sebaliknya; mungkin. Menurut sebuah contoh:
Misalkan kita memiliki kelas TPerson yang didefinisikan sebagai berikut:
TPerson = Kelas(TObject)
Pribadi
FSex: TSex; // TSex adalah jenis kelamin dari tipe enumerasi;
FNama Depan: String;
Nama FLast: String;
//…
Publik
properti Jenis Kelamin: TSex baca FSex tulis FSex;
properti NamaDepan: String baca FFirstName tulis FFirstName;
properti Nama Belakang: String baca FLastName tulis FLastName;
//…
akhir;
Kemudian, untuk penunjuk Person bertipe TPerson, Anda dapat menggunakan kode berikut untuk menentukan apakah penunjuk tersedia:
Mencoba
Orang.Jenis Kelamin;
//Atau Orang.NamaDepan;
//Atau Orang.NamaBelakang;
hasil := Benar; //Penunjuk tersedia
Kecuali
hasil := Salah;//Penunjuk tidak tersedia
akhir;
Apa yang kita bahas di atas hanyalah kemungkinan teknis saja. Hal yang ingin saya tekankan adalah meskipun ada cara yang baik untuk melakukannya, namun tidak dianjurkan untuk sering melakukannya. Karena program dengan logika yang ketat harusnya mampu mencegah akses ke pointer yang tidak valid.
Lebih banyak artikel